Python fermat程序仅适用于较低的数字

时间:2014-03-11 13:57:01

标签: python recursion infinite

我在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)

3 个答案:

答案 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实施应该有所帮助。