我正在制作一个程序,它使用一个循环来永远运行,下面有一段代码,向您展示我如何实现循环。这只是一个例子,而不是实际的程序。这是同样的想法。
import time
def start():
print "hello"
time.sleep(0.2)
start()
start()
我所有的程序员朋友都告诉我不要这样做,而是使用while循环。像这样:
import time
def start():
while True:
print "Hello"
time.sleep(0.2)
start()
当两种方法完全正常工作时,为什么要使用while循环呢?
答案 0 :(得分:6)
每次递归时,都会将帧上下文推送到程序堆栈中。很快你就会耗尽整个分配的堆栈空间,导致堆栈溢出,没有双关语;)
第二种方法没有这样的缺陷。因此,从它的外观来看,第二种方法比第一种方法更好(除非提出更多的方案)。
答案 1 :(得分:2)
如果您通过递归连续运行程序,您将获得RuntimeError
:
Traceback (most recent call last):
File "t.py", line 8, in <module>
start()
File "t.py", line 7, in start
start()
File "t.py", line 7, in start
start()
...
File "t.py", line 7, in start
start()
RuntimeError: maximum recursion depth exceeded
>>> import sys
>>> sys.getrecursionlimit()
1000
答案 2 :(得分:1)
while循环和递归都有它们的优点和缺点,但循环只是一个测试和条件跳转。 wheras ecursion涉及推动堆栈帧,跳跃,返回,并从堆栈弹出。所以他们可能更喜欢while循环:)
答案 3 :(得分:1)
Python没有Tail Call Optimization (TCO)并且无法忽略堆栈。因此,递归应该不用于未绑定深度(在没有TCO的语言中),以免出现堆栈溢出错误!
虽然当前代码可能看起来很好,但请考虑这个简单的更改,这很快就会发现问题。
def start():
print "hello"
# let's go faster! -- time.sleep(0.2)
start()
start()