我必须编写一个程序,它使用递归函数来计算字符串中重复字符对的数量,并且字符对不能重叠。
比方说,我输入字符串“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
有人可以提出我出错的地方吗?
答案 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