Найти количество раз, когда функция Акермана вызывается в Python

Я хочу сделать функцию, которая возвращает два значения. Первый должен быть выводом функции ackerman, а второй - количество вызовов функции.

Я сделал функцию Ack:

def ack(m,n):
    if m == 0:
        return n + 1
    elif m > 0 and n == 0:
        return ack(m - 1.0, 1.0)
    elif m > 0 and n > 0:
        return ack(m - 1.0, ack(m, n - 1.0))

Я попытался сделать глобальный подсчет и добавить его перед if и elifs и вернуть с ответом:

global count
count +=1

if m == 0:
    return n+1, count

Это явно неправильно. Он будет возвращать счетчик каждый раз, когда m = 0, и это будет кортеж.

Как я могу сделать так, чтобы он возвращал список ответов (например) ack(3,4), который должен быть 125, и количество раз, которое он должен был вызвать ack(m,n). Поэтому, если я вызову ack(1.0,0.0), он должен вернуть [2.0, 2]. Мне нужен список, потому что мне нужно сделать некоторые вычисления с этой суммой.

Причина, по которой мне нужно знать, заключается в том, что учитель дал нам задание, и я полностью застрял.

2 ответа

Решение

Просто добавьте 1 каждый раз, когда вы повторяете:

def ack(m,n):
    if m == 0:
        return (n + 1, 1)
    elif m > 0 and n == 0:
        a, cnt = ack(m - 1.0, 1.0)
        return a, cnt+1
    elif m > 0 and n > 0:
        a1, cnt1 = ack(m, n - 1.0)
        a2, cnt2 = ack(m - 1.0, a1)
        return a2, 1 + cnt1 + cnt2



>>> ack(3, 4)
    (125.0, 10307)
>>> ack(1, 0)
    (2.0, 2)

Просто добавьте счетчик и увеличивайте каждый вызов:

def ack(m,n):
    if m == 0:
        return n + 1, 1
    elif m > 0 and n == 0:
        res, count = ack(m - 1, 1)
        return res, count + 1
    elif m > 0 and n > 0:
        t, tc = ack(m, n - 1)
        res, rc = ack(m - 1, t)
        return res, tc + rc + 1
Другие вопросы по тегам