Найти количество раз, когда функция Акермана вызывается в 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