使用递归查找字符串中的相邻字符对

时间:2015-05-07 13:51:33

标签: python python-3.x recursion

我必须编写一个程序,它使用递归函数来计算字符串中重复字符对的数量,并且字符对不能重叠。

比方说,我输入字符串“Hello,Sabeena”。我需要输出为“2”,一个用于ls,一个用于es。

这是我尝试过的,但没有输出。

message = input("Enter a message:\n")
pairs = 0
k = 0

if len(message) == k:
    return("Number of pairs:",pairs)
else:
    if message[k] == message[k+1]:
        pairs = pairs + 1
        k = k+1
    else:
        k = k+1

理想情况下,程序应如下所示:

Enter a message:
Hello, Sabeena
Number of pairs: 2

有人可以提出我出错的地方吗?

2 个答案:

答案 0 :(得分:2)

将递归代码放在一个函数中(它确实不能被认为是递归的),如果你没有达到基本情况(k == len(message) - 1),则返回对函数的递归调用,递增每次k

def find_adjacent(message, pairs, k):
  if k == len(message) - 1: #subtract one to avoid getting a string index out of range error
    return("Number of pairs:", pairs)
  else:
    return find_adjacent(message, pairs+1 if message[k]==message[k+1] else pairs, k+1)


if __name__ == "__main__":
  message = "message" # change to input("Enter a message:\n")
  pairs = 0
  k = 0
  m, p = find_adjacent(message, pairs, k)
  print m, p

以上打印

Number of pairs: 1

如果你喜欢它不那么紧凑,而且更具可读性:

def find_adjacent(message, pairs, k):
  if k == len(message)-1:
    return("Number of pairs:", pairs)
  elif message[k] == message[k+1]:
    if k == 0:
      return find_adjacent(message, pairs+1, k+1) # first letter of message, all good
    elif message[k] != message[k-1]:
      return find_adjacent(message, pairs+1, k+1) # not first letter, and this pair hasn't been counted before
    else:
      return find_adjacent(message, pairs, k+1) # this sequence has already been counted
  else:
    return find_adjacent(message, pairs, k+1)

答案 1 :(得分:0)

这是一个递归函数,每次都会传递新的邮件副本。

这是大多数递归函数的作用:不是内存效率高,而是以比基于循环的方法更简单的方式解决问题。当然不是这种情况,但这只是一个练习。

def count_adj(message, adj, c):
    """Recursively counts the number of adjacent characters"""
    if len(message) < 1:
        return adj
    else:
        if c == message[0]:
            adj += 1
        return count_adj(message[1:], adj, message[0])


tests = ("Hello, Sabeeenaa", "Hi", "h", "HH", "HHH", "", " ", "  ")

for t in tests:
    print t, ":", count_adj(t, 0, '')

结果:

Hello, Sabeeenaa : 4
Hi : 0
h : 0
HH : 1
HHH : 2
 : 0
  : 0
   : 1
相关问题