2

我想做一个返回两个值的函数。第一个应该是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]。我需要一个列表,因为我需要用这个总和进行一些计算。

我需要知道的原因是因为老师给了我们一个任务,我完全被困住了。

4

2 回答 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)
于 2014-04-13T20:05:12.790 回答
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
于 2014-04-13T20:04:58.513 回答