Python 3 - использование sys.setrecursionlimit () - PullRequest
1 голос
/ 04 апреля 2020

Я написал этот код:

d=1
a=[d,d-1,d]
b=[]



def fctn(f):
    h=2
    if d>1:
        b.append(f)
        b.append(d-h)
    h+=1

    if d-h>0:
        fctn(f)
    elif d-h==0:
        b.append(f)
        b.append(0)
    elif d==1:
        b.append(f)

    for i in range(len(b)-1):                                  
        b.append(b[i])
    print(b)

С:

d=2

, как и ожидалось, я получаю:

[[2, 1, 2], 0, [2, 1, 2]]    

с:

d=3

, как и ожидалось, я получаю:

[[3, 2, 3], 1, [3, 2, 3], 0, [3, 2, 3], 1, [3, 2, 3]]

Однако, для d> 3 , я получаю следующую ошибку:

RecursionError: maximum recursion depth exceeded in comparison

Итак, Я попытался использовать:

sys.setrecursionlimit()

и попытался запустить следующий код (как из IDLE, так и из командной строки):

import sys
sys.setrecursionlimit(10**4)

d=1
a=[d,d-1,d]
b=[]



def fctn(f):
    h=2
    if d>1:
        b.append(f)
        b.append(d-h)
    h+=1

    if d-h>0:
        fctn(f)
    elif d-h==0:
        b.append(f)
        b.append(0)
    elif d==1:
        b.append(f)

    for i in range(len(b)-1):                                  
        b.append(b[i])
    print(b)    

В этот момент не возникает никаких ошибок, но вывод пусто Точнее, при запуске из IDLE я просто получаю:

 =============================== RESTART: Shell ===============================

Итак, мне кажется, что предыдущий RecursionError исчез, но, тем не менее, код не выполняется так, как я ожидал, по сути ничего не давая в качестве вывода.

Что с этим не так? Также, увеличив предел рекурсии до 10 ^ 9, я тоже ничего не получаю. Любое предложение о том, как решить проблему?

1 Ответ

0 голосов
/ 04 апреля 2020

Вы застряли в бесконечной рекурсии, поэтому увеличение глубины рекурсии не поможет. Проблема в том, что вы присваиваете

h=2

, затем вы

h+=1

Теперь h равно 3, а d равно 4.

Затем вы попадаете в строку:

if d-h>0:
    fctn(f)

4-3> 0 всегда будет истинным, поэтому вы будете рекурсивно вызывать функцию снова и снова каждый раз, когда вызываете fctn (f), когда d> 4.

Отладка код помог бы вам найти проблему. Я бы посоветовал изучить отладку, если вы еще не знакомы с ней.

...