查找在Python中调用Ackerman函数的次数

时间:2014-04-13 19:55:02

标签: python ackermann

我想创建一个返回两个值的函数。第一个应该是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和elif之前添加它并将其返回给答案:

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 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

只需添加一个计数并递增每次调用:

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