有两个函数可以无休止地运行吗?

mic*_*pri 2 python function python-2.7

我构建了一个简单的Python程序来查找输入是否为2的幂.我有两个功能,power_of_twoplay_again.之后power_of_two运行,play_again然后运行和重播power_of_two

这是我的代码:

num = int(raw_input('Input a number (type 0 to quit): '))
def power_of_two(x):
    y=1
    z=[]
    while y < x:
        y=y*2
        z.append(y)
    if x in z or x == 1:
        print 'true'
    elif x == 0:
        quit()
    else: 
        print 'false'
    play_again()

def play_again():
    num = int(raw_input('Input a number: '))
    power_of_two(num)

power_of_two(num)
Run Code Online (Sandbox Code Playgroud)

这样的代码在Python程序员中是否可以接受,或者是否有更好的方法来复制我在这里做的事情?

DNA*_*DNA 11

这种方法的一个问题是你最终会耗尽堆栈,因为我们有一对相互递归的函数.每次调用都会占用堆栈中的内存,而这些内存永远无法恢复.

这对于交互式程序来说并不明显,因为创建足够的递归调用需要很长时间,但如果我们加快速度:

def power_of_two(x):
    print(str(x))
    play_again(x)

def play_again(x):
    power_of_two(x+1)

power_of_two(1)
Run Code Online (Sandbox Code Playgroud)

我们得到:

RuntimeError: maximum recursion depth exceeded while calling a Python object
Run Code Online (Sandbox Code Playgroud)

有些语言可以进行尾调用优化,所以这种技术运行正常 - 但在Python中最好创建一个"再次播放"的循环,除非你可以确定只有一个小的调用深度.