使用递归来求和两个数字(python)

时间:2010-05-02 23:17:25

标签: python function recursion

我需要编写一个递归函数,可以添加两个数字(x,y),假设y不是负数。我需要使用两个返回x-1和x + 1的函数来完成它,我不能在代码中的任何地方使用+或 - 。我不知道如何开始,任何提示?

6 个答案:

答案 0 :(得分:4)

大提示:您正在描述Peano arithmetic

答案 1 :(得分:3)

让我们说

succ(x)=x+1
pre(x)=x-1

然后,(在伪代码中)

add(x,y) = {
    If(y==0) Return x;
    Return add(succ(x),pre(y))
}

观察,这仅适用于非负y。

答案 2 :(得分:1)

伪代码:

for i = 0 to y
    x = f(x)
next

其中f(x)是返回x + 1

的函数

或者,如果你不能进行for循环,因为它需要+ s:

while (y > 0) {
    x = f(x)
    y = g(y)
}

其中f(x)是给出x + 1的函数,g(y)是给出y-1的函数

答案 3 :(得分:1)

OP在评论中说:

  

我收到错误 - “最大递归   深度超过“。

您可以尝试使用sys.recursionlimit增加递归限制(当然,在import sys之后),但这只会让您达到一定程度。 Python没有被称为“尾递归消除”的优化,它(可能是美妙的语言;-)并不能使它成为用于递归教学的特定目的的最佳语言(最好的语言,恕我直言,但不是在我看来,将是Scheme或Lisp的一些变体)。因此,当y大于您可以在您的机器上设置的最大递归限制(取决于系统)时,该错误将不可避免地随之发生。

或者,您可能错误地编码了“基本递归防护”,当y等于0时,它应该在没有进一步递归的情况下返回,或者您可能尝试使用{{1}调用该函数(这将不可避免地“无限地递归”,即在不可避免地超过最大递归限制时产生上述错误。)

答案 4 :(得分:0)

def sum(a,b):
    if b==0:
        return a
    return sum(a+1,b-1)

答案 5 :(得分:-4)

这听起来像是家庭作业。所以这可能是作弊:

a+ba.__add__(b)

相同

a-ba.__sub__(b)相同。

因此,您可以轻松地添加或减去两个数字,而无需使用+/-。不需要任何递归。