-2

这是我的代码:

def isEven(number):
    return number % 2 == 0

def run(x):
    z = x
    while z != 1:
        if isEven(z) == True:
            z = z/2
            print z
        else:
            z = (3*z)+1
            print z
    else:
        print 'Got one!'
        #To see if the collatz does indeed always work
    x+=1

它一直工作到 999 年,它无限期地继续打印Got one! 999,最终提高了Segmentation Fault: 22. 我该如何解决?

4

2 回答 2

1

这是一个更清洁的版本:

def collatz(x):
    yield x
    while x > 1:
        if x & 1:
            # x is odd
            x = 3*x + 1
            yield x
        # x is now even
        x //= 2
        yield x

def main():
    for x in xrange(2, 5000):
        print('-'*20)
        print(','.join(str(c) for c in collatz(x)))

if __name__=="__main__":
    main()
于 2014-02-06T06:17:00.793 回答
-2

使用 asys.setrecursionlimit阻止 999 永远重复。这是您的代码的编辑版本。我也放了一个sys.argv[],只是为了好玩,因为我导入了sys. 像这样sys.argv[]运行程序后获取参数:python myscript.py 13.5在此,sys.argv[1]is 13.5。我将递归限制设置得很高,但这样做的缺点是Segmentation Fault: 22仍然会发生,我还没有找到摆脱它的方法。

import time
import sys
while True:
    try:
        var = int(sys.argv[1])
        break
    except IndexError:
        print 'You have to enter a number!'
        var = int(raw_input('Enter a number: '))
        break

def check(x):
    z = x
    try:
        while z != 1:
            if isEven(z) == True:
                z = z/2
                print z
            else:
                z = (3*z)+1
                print z


        else:
            print 'Got one!'
            x = x+1
            print 'Trying for %d...' %(x)
            check(x)
    except:
        print 'You were at number %d' %(x)
        check(x)

def isEven(number):
        return number % 2 == 0

sys.setrecursionlimit(10000000)
check(var)
于 2014-02-06T05:58:13.980 回答