我有一个计算recursive_sum(5,5,0)
的递归函数,但是当我调用它时,我不想给它一个值:0
其中def recursive_sum(a,b,saved):
if b == 1:
saved+=a
return saved
saved += a
b -= 1
b*recursive_sum(a,b,saved)
是保存的总和。
save=0
我知道这是一个非常简单的例子
当我添加行0
以便我不必传递无意义的参数时,很明显,每次迭代都会将值重置为recursive_sum(2,2)
。
我的问题:有没有办法实现我的功能来处理调用0
,而不必担心将saved
传递给{{1}}?
答案 0 :(得分:2)
这整个方法只适用于整数,但这可能会让你直截了当:
def recursive_sum(a,b):
if b == 1:
return a
return a + recursive_sum(a, b-1)
这里的想法是你的return语句需要调用函数调用的下一次迭代,然后使用它接收的结果来计算它自己的返回值。当你写一个递归函数时,你真的写了f(f(... f(x)))。您有两个要实现的组件:
尝试实现递归因子函数。这可能是最简单的(除了可能是一笔)递归函数。
答案 1 :(得分:1)
您的代码有两个问题。
首先,您没有在函数声明中包含saved
的默认值(尽管您提到了尝试)。我怀疑当你尝试它时,你实际上做了一些不同的事情(在递归调用中传递一个关键字参数)。
其次,你不是return
递归调用的结果(而是将结果乘以b
,这没有任何意义,也没有做任何有用的事情,因为你放弃了结果)。
这是一个固定版本:
def recursive_sum(a,b,saved=0): # provide default value for saved here
saved+=a # minor improvement: moved this line here rather than repeating it twice below
if b == 1:
return saved
b -= 1
return recursive_sum(a,b,saved) # return result of recursive call (and don't multiply)
我怀疑当你尝试使用默认值之前,你也(或者说)将saved=0
放在函数末尾的递归调用中(不仅仅在def
行)。这将无法正常工作,因为它将0
作为关键字参数传递,忽略了您已经拥有的saved
的值。
此版本的代码是“尾递归”,因为您return
递归调用的结果而不执行任何其他操作。这种递归在其他一些编程语言中有一些性能优势,但不是在Python中。除非您出于某种特定原因选择尾递归(例如,您需要将其用于作业),RagingRoosevelt's answer中的非尾递归代码可能比此版本更好。
答案 2 :(得分:1)
def recursive_sum(a,b):
def iterative_sum(x, saved):
if x == 0:
return saved
else:
return iterative_sum(x-1, saved+a)
return iterative_sum(b,0)