Python 当我运行这段代码时,它将循环3000次以上

Python 当我运行这段代码时,它将循环3000次以上,python,Python,我只是试着跑步和玩一些def来训练自己,不小心 当我到处调用这个函数时,它会反复循环,直到达到3000次。 为什么数到3000次,然后停下来 def print_two(*args): arg1, arg2 = args print "arg1: %r, arg2: %r" %(arg1, arg2) print_no_thing() def print_no_thing(): print ("No thing ") print_two_again("

我只是试着跑步和玩一些def来训练自己,不小心 当我到处调用这个函数时,它会反复循环,直到达到3000次。
为什么数到3000次,然后停下来

def print_two(*args):
    arg1, arg2 = args
    print "arg1: %r, arg2: %r" %(arg1, arg2)
    print_no_thing()


def print_no_thing():
    print ("No thing ")
    print_two_again("me and ", "you")

def print_two_again(arg1,arg2):
    print "arg1:%r, arg: %r" %(arg1,arg2)
    print_two("pack","packer")

print_two_again("cool", "cooler")

假设问题是您不想循环,那么您需要一个所谓的
终端条件
。目前:

  • print\u two\u再次
    调用
    print\u two
  • print\u two
    calls
    print\u no\u thing
  • print\u no\u thing
    再次调用
    print\u two\u
没有
条件子句
,因此函数将继续相互调用,并且永不停止。你需要插入一些东西,让它退出。有两种方法可以做到这一点:

  • 不要让最后一个函数调用第一个函数
  • 跟踪循环次数并最终停止
首先:

def print_two(*args):
    arg1, arg2 = args
    print "arg1: %r, arg2: %r" %(arg1, arg2)
    print_no_thing()


def print_no_thing():
    print ("No thing ")

def print_two_again(arg1,arg2):
    print "arg1:%r, arg: %r" %(arg1,arg2)
    print_two("pack","packer")

print_two_again("cool", "cooler")
第二项:

# Note that you shouldn't actually use global variables, but this is clear for demonstration purposes
max_loops = 100
current_loops = 0

def print_two(*args):
    arg1, arg2 = args
    print "arg1: %r, arg2: %r" %(arg1, arg2)
    print_no_thing()


def print_no_thing():
    print ("No thing ")
    if max_loops > current_loops:
        current_loops += 1
        print_two_again("me and ", "you")

def print_two_again(arg1,arg2):
    print "arg1:%r, arg: %r" %(arg1,arg2)
    print_two("pack","packer")

print_two_again("cool", "cooler")
它目前停在三千的原因是您达到了Python的最大递归深度。每个函数都将创建一个新的“堆栈帧”,因为您永远不会从函数返回(只调用新函数),所以您只能添加新的堆栈帧。最终您将耗尽(当您达到
最大递归深度时)。更多信息,请参阅


注意,虽然可以使用最大递归深度,但不建议使用<代码>3000
远远超出了绝大多数用例的需要。

酷。你有问题吗?还要考虑你的格式化,以便我们可以阅读它(选择文本并点击CTRL K)你的问题是什么?“终端条件”听起来像医生告诉我的…我一直听说它被称为“停止条件”…@rubesmoker很公平,但我把它作为
终端条件
终止条件
,或
基本情况
(如果你真的在做递归)。呵呵,好的。我猜是程序员的幽默;-)<代码>暗色的字母数与
代码
的字母数相同,毕竟…;-)