Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python方法可以无限期地调用自己吗_Python_Tail Recursion - Fatal编程技术网

python方法可以无限期地调用自己吗

python方法可以无限期地调用自己吗,python,tail-recursion,Python,Tail Recursion,我有一个python方法,它会不时执行一些任务。 我发现最简单的方法是写: class MyClass: def a(self): #perform the task time.sleep(time_to_sleep) self.a() 但是这个方法应该运行很长时间,可能几个月,这意味着它的方法可以递归调用10^4次 这样做有风险吗?如果无限期地继续递归到函数中,迟早会出现以下错误- RuntimeError: maximum recu

我有一个python方法,它会不时执行一些任务。 我发现最简单的方法是写:

class MyClass:
    def a(self):
        #perform the task 
        time.sleep(time_to_sleep)
        self.a()
但是这个方法应该运行很长时间,可能几个月,这意味着它的方法可以递归调用10^4次


这样做有风险吗?

如果无限期地继续递归到函数中,迟早会出现以下错误-

RuntimeError: maximum recursion depth exceeded
一个简单的例子来说明这一点-

>>> def a():
...     global i
...     i += 1
...     a()
然后我使用as运行这个函数-

>>> i = 0
>>> a()
这给了我上面的错误,之后当我打印
I
的值时,它是999。所以你迟早会犯这个错误

您也可以通过调用来更改此限制,尽管我不建议这样做,因为您可能在达到限制之前就结束了堆栈(更简单的方法是使用while循环,如下所示)-

简而言之:不
递归函数有一个调用限制。正如所证明的,您可以看到自己正在修改:

当呼叫数达到3时,您将看到: 运行时错误:

.
.
Traceback (most recent call last):
  File "teste.py", line 14, in <module>
    m.a()
  File "teste.py", line 11, in a
    self.a()
  File "teste.py", line 11, in a
    self.a()
RuntimeError: maximum recursion depth exceeded
另外,请注意:设置的值太高且超过 sys.getrecursionlimit(),可能会导致C堆栈溢出, 制作Python解释器失败


我想使用while循环会更容易,并且避免潜在的破坏堆栈,你到底在做什么?OP声明该方法最多会调用自己10**4次,您可以将recursionlimit设置为10**4,这样他们就不一定会得到超过最大递归深度的错误。他说-
但该方法应该运行很长时间,可能会运行数月,这意味着它的方法最多可以递归调用10^4次。
-我没有看到他将其限制为
10**4
。不管怎样,这是个坏主意,检查一下关于
记忆错误的第二部分。我说这是个好主意吗?我说有一个限制,它可以改变,这在你的答案中是没有的。
class MyClass:
    def a(self):
        while True:
            #perform the task 
            time.sleep(time_to_sleep)
import time, sys
# max calls: 3
sys.setrecursionlimit(3)

class MyClass:
    def a(self):        
        print "."
        time.sleep(1)
        self.a()

m = MyClass()
m.a()
.
.
Traceback (most recent call last):
  File "teste.py", line 14, in <module>
    m.a()
  File "teste.py", line 11, in a
    self.a()
  File "teste.py", line 11, in a
    self.a()
RuntimeError: maximum recursion depth exceeded
>>> import sys
>>> sys.getrecursionlimit()