Почему python останавливает вычисления, не выдавая ошибку при вычислении Аккермана? - PullRequest
0 голосов
/ 22 марта 2020

Я написал код для вычисления функции Аккермана и сохранения результатов, но в какой-то случайный момент он просто останавливается (хотя только для поисковой версии), нормальная версия просто запускается без остановки.

Это не может быть предел рекурсии, может быть, словарь слишком большой? Однако он не использует слишком много памяти.

Вот код:

import time, sys
sys.setrecursionlimit(100000)

lookup = {}
def ackermann(m,n,look):

    if (m,n) in lookup and look: #Checks if the pair is in the table
        print("pair found")
        return lookup[(m,n)]

    else: #Regular ackermann
        if m == 0:
            print("Base found for {} {}".format(m,n))
            return n+1

        if n == 0:
            print("Case 2: {} {}".format(m,n))
            result = ackermann(m-1,1,look)
            if look:
                lookup[m,n] = result
            return result

        else:
            print("Case 3: {} {}".format(m,n))
            result = ackermann(m-1,ackermann(m,n-1,look),look)
            if look:
                lookup[m,n] = result
            return result




def call_ack(m,n):
    t1= time.time()
    result1 = ackermann(m,n,True)    
    t2= time.time()
    result2 = ackermann(m,n,False)
    t3= time.time()
    print("Result with lookup:",result1, "\nElapsed time:",t2-t1)
    print("\nResult without lookup:",result2, "\nElapsed time:",t3- t2)
    print("Difference: ", t3+t1-t2*2)  

Это последняя часть одного из выходов:

Case 3: 1 7947
Case 3: 1 7946
pair found
Base found for 0 7947
Base found for 0 7948
Case 3: 1 7949
Case 3: 1 7948

Если я запускаю его снова:

Case 3: 2 4695
Case 3: 2 4694
Case 3: 2 4693
Case 3: 2 4692
Case 3: 2 4691
Case 3: 2 4690
Case 3: 2 4689
Case 3: 2 4688
Case 3: 2 4687
Case 3: 2 4686
Case 3: 2 4685
Case 3: 2 4684
Case 3: 2 4683
Case 3: 2 4682
Case 3: 2 4681
Case 3: 2 4680
Case 3: 2 4679

Без изменений. О, мальчик, я люблю противоречивые результаты! Стоит отметить, что для небольших значений он работает просто отлично.

Редактировать: я только что попробовал этот онлайн python переводчик , и он работает просто отлично.

Редактировать 2: Я пытался запустить его с другой версией python (3.8.2 вместо 3.7) и закрывается с ошибкой переполнения стека. Дело в том, что он не использует только память - не более 6,6 МБ в соответствии с диспетчером задач.

...