如何减少递归函数定义所需的参数(用于计算a * b)

时间:2017-08-09 21:08:19

标签: python recursion parameters arguments

我有一个计算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}}?

3 个答案:

答案 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. 一般(递归)情况 - 如何使用以前的结果按顺序计算下一个结果?
  2. 基本情况 - 您如何确定您不需要任何额外的递归?在这种情况下,您只需返回一个值,而无需再次调用该函数。
  3. 尝试实现递归因子函数。这可能是最简单的(除了可能是一笔)递归函数。

答案 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)