LINUX.ORG.RU

Кончился стек

// КО

anonymous
()

потому что не написано граничное условие выхода из рекурсивной функции, и рекурсия не хвостовая, и я не знаю умеет ли питон оптимизировать хвостовую рекурсию…

fsb4000 ★★★★★
()
Последнее исправление: fsb4000 (всего исправлений: 1)

как только n станет нулем, он благополучно декрементируется и пойдет дальше -1,-2,-3… :)

alysnix ★★★
()
Ответ на: комментарий от fsb4000

не написано граничное условие выхода из рекурсивной функции

ошибка возникает даже если аргумент целое положительное число

граничное условие так вроде: sum_numbers(n-1)

w1rox
() автор топика

граничное условие - это условие непродолжения рекурсии. это вроде питон… не особо его знаю должно быть типа так(но работает естессно только для положительных чисел):

if(n==0) return 0
return n+sum_numbers(n-1)

опять же вычислить итеративные понятия рекурсией это моветон. на рекурсию наложено ограничние глубины, на итерации - не наложено(если не рассматривать переполнение счетчика)

alysnix ★★★
()

гугли про рекурсию и читай, там несложно.

Кстати я проверил, в python не поддерживается оптимизация хвостовой рекурсии :(

Такой код, всё равно выдает

RuntimeError: maximum recursion depth exceeded
def sum_numbers_tail(n):
    def local_sum(num, part_sum):
        if num <= 0:
            return part_sum
        return local_sum(num-1, part_sum+num)
    return local_sum(n, 0)

print (sum_numbers_tail(10000))

В С++, например, хвостовая рекурсия оптимизируется в цикл: https://gcc.godbolt.org/z/W5Ltpa

И переполнения стека никогда не произойдёт. Также как в F#, Haskel и некоторых других языках…

fsb4000 ★★★★★
()
Ответ на: комментарий от alysnix

пограничное условие

Сорри, переусердствовал с учением, и почему-то решил что перебор идет во возрастанию (( А причина была так очевидна. Спасибо!

w1rox
() автор топика
Ответ на: комментарий от fsb4000

Рекурсия

Спасибо, обязательно почитаю про рекурсию в целом))

w1rox
() автор топика

Python 2.7 уже не существует. Раз вы только начали изучать Python,начинайте с нормального. Ошибка в том, что в программном примере содержится бесконечный цикл (это уже объяснили) , вы только не поняли суть сообщения об ошибке

Partisan ★★★★
()
Ответ на: комментарий от Partisan

Не спорю с тем, что надо учить python3. Но python2 жив, проект pypy объявили что они собираются поддерживать свою реализацию python 2.7 вечно(пока жив проект pypy), и им не важно что CPython прекратил поддержку python2

fsb4000 ★★★★★
()
Ответ на: комментарий от Partisan

Python 2.7

Я просто начал с него изучение Python, и пока учу его, дабы в голове не было путаницы. А так да, наверное всё таки учить лучше третий, дабы сэкономить время

w1rox
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.