2016-03-10 2 views
-9

Я просто попытался запустить и поиграть с некоторым определением, чтобы тренировать себя, случайно , когда я вызываю эту функцию здесь и там, она петляет снова и снова, пока не достигнет 3000 раз.
Почему подсчет 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") 
+0

Прохладный. У вас есть вопрос? Также подумайте об исправлении вашего форматирования, чтобы мы могли его прочитать (выберите текст и нажмите ctrl-k) – DaveBensonPhillips

+7

В чем вопрос? – MarkyPython

ответ

2

Предполагая, что проблема в том, что вы не хотите, чтобы цикл, вам нужно иметь то, что называется terminal condition. В настоящее время:

  • print_two_again называет print_two
  • print_two звонки print_no_thing
  • print_no_thing звонки print_two_again

Там еще нет conditional clauses поэтому функции будут продолжать звонить друг другу и никогда не останавливаться. Вам нужно измерить что-то, что приведет к его прекращению. Существует два способа сделать это:

  • Не выполняйте свою последнюю функцию, когда выполняете первую функцию.
  • Следите за тем, сколько раз вы зацикливаете и в конце концов останавливаетесь.

Для первого:

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. Каждая функция создаст новый «стек кадров», и поскольку вы никогда не возвращаетесь к своим функциям (только для вызова новых функций), вы только добавляете новые фреймы стека. В конце концов вы закончите (когда вы достигнете своего maximum recursion depth). См. this для получения дополнительной информации.

Обратите внимание, что, хотя можно играть с максимальной глубиной рекурсии, это не рекомендуется. 3000 намного превосходит то, что вам нужно для подавляющего большинства случаев использования.

+0

«Терминальное состояние» звучит как-то, о чем доктор сообщит мне ... Я всегда слышал, что это называется «условием остановки» ... – Carpetsmoker

+0

@Carpetsmoker Справедливая оценка, но я узнал ее как «терминальное условие» или «условие завершения» или «базовый регистр» (если вы действительно делаете рекурсию). –

+0

Хе-хе, ладно. Программистский юмор, я думаю ;-) – Carpetsmoker

Смежные вопросы