我在Python中编写了这个代码,它应该找到符合方程a ^ 2 + b ^ 2 = c ^ 2的数字。 它适用于低数字 - 高达约14 - 然后变得混乱(无限递归)。 我不会问它是否只是没有用,但我很困惑为什么只偶尔工作。 要使用它我输入例如。费马(12,1,1)
def fermat(a,b,c):
if a==1:
print('finished')
return
elif b==a:
a=a-1
b=1
c=1
fermat(a,b,c)
elif c==a:
b=b+1
c=1
fermat(a,b,c)
elif (a**2)-(b**2)==c*c:
print(a,b,c,'fermat')
b=b+1
c=1
fermat(a,b,c)
elif (a**2)-(b**2)!=c*c:
c=c+1
fermat(a,b,c)
答案 0 :(得分:1)
这是因为你有太多的深度递归。函数可以一次又一次地调用自身。
我建议你用一个简单的循环删除递归。
答案 1 :(得分:0)
首先,我重写了你的功能,所以它不那么冗长:
def fermat(a,b,c):
if a==1:
print('finished')
return
elif b==a:
fermat(a-1,1,1)
elif c==a:
fermat(a,b+1,1)
elif (a**2)-(b**2)==c*c:
print(a,b,c,'fermat')
fermat(a,b+1,1)
elif (a**2)-(b**2)!=c*c:
fermat(a,b,c+1)
else:
raise ValueError
添加评论中提到的else
语句。您的错误来自(2,1,3)
之类的输入,它匹配条件(a**2)-(b**2)!=c*c
并调用(2,1,4)
然后调用(2,1,5)
...这永远不会终止并最终达到最大递归限制。
答案 2 :(得分:0)
可能超出递归限制。
不幸的是,对于这种方法,你需要适当的尾调用消除,其中堆栈不会随着每个尾调用而增长。 Stackless Python实施应该有所帮助。