我有我编写的这个递归函数(简化了,虽然更长,但是想法保持不变)
def rec(point,length):
if 1<length<=8:
str_adj = '23456'
for adj in str_adj:
return rec(adj, length-1)
elif length == 1:
return 1
else:
return 0
rec('1',2)
[免责声明:我知道代码看起来很怪异,不需要某些部分,因为我简化了功能。 ]
现在,当我运行此代码时,我得到: 1 ,但是当我遍历字符串'23456'的每个字母(包含5个字母)时,输出需要为 5 ),对于每个字母,我用1的长度来称呼它(当我将其减小2-1 = 1时),每次我们得到length = 1时,我们都返回1,因此它应该返回5次。.
我坐下来调试并将代码分解为多个部分,并尝试了许多不同版本,例如在循环中删除“ return”,但是这样做时,输出为None ...
有人可以帮我发现错误吗?谢谢!
在python代码中,我尝试执行以下操作:
rec('2',1)+rec('3',1)+rec('4',1)+rec('5',1)+rec('6',1) = 1 + 1 + 1 + 1 +1 = 5
每次调用rec(?,1)= 1
比方说str_adj ='123456789'和length = 2
那么我想输出为:
rec('1',1)+ rec('2',1)+等。直到+ rec('9',1)
每次我们调用rec(?,1)= 1时,它应该返回9
答案 0 :(得分:1)
我不确定最终目标是什么,但是您的逻辑正在破坏代码。第一次调用rec时,它会输入第一个“ if”语句,然后从该位置调用
rec('2', 1)
此函数的调用输入“ elif”语句,返回1,然后结束。
如果您可以澄清要完成的任务,我可以尝试帮助解决此逻辑。
答案 1 :(得分:1)
您的预期行为与发生的情况不符。您无需修改str_adj
并将每次设置str_adj
等于23456
。在您的for循环中,adj
将始终为2
,除非您对其进行更改。为此,它也不必是函数局部变量。
您还将需要一些东西来跟踪您的迭代。
像这样进行示例,将为您提供所需的结果。您可以做得更好,但是我会尽力更改它并匹配您的格式。
def rec(point,length, str_adj, iterations):
print("rec(", point, ", ", length, ", ", str_adj, ", ", iterations, ")")
if 1<length<=8:
for adj in str_adj:
str_adj = str_adj[1:]
iterations = iterations + 1
return rec(adj, length-1, str_adj, iterations)
elif length == 1:
return iterations
else:
return 0
iterations = 1;
str_adj = '23456'
print(rec('1',4, str_adj, iterations))