我需要编写一个递归函数,可以添加两个数字(x,y),假设y不是负数。我需要使用两个返回x-1和x + 1的函数来完成它,我不能在代码中的任何地方使用+或 - 。我不知道如何开始,任何提示?
答案 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+b
与a.__add__(b)
和
a-b
与a.__sub__(b)
相同。
因此,您可以轻松地添加或减去两个数字,而无需使用+/-。不需要任何递归。