我不了解此函数的工作原理以及60的结果如何

问题描述 投票:2回答:2
def A(x, y):
    if x == 0:
        return y + 2
    if y == 0:
        return A(x - 1, 1) + 1
    return A(x - 1, A(x, y - 1)) * 2

print(A(1, 3))

输出为60。我运行了代码,但不知道如何获得该值。很抱歉这个愚蠢的问题。

python function recursion
2个回答
6
投票

[A似乎是递归的,所以当您调用A(1,3)时,它会不断调用自身。

让我们看一下:

  • 第一次运行它,x != 0,因此它不会返回y+2
  • y != 0,因此它不会返回A(x-1, 1) + 1
  • 而是返回A(x-1, A(x, y-1)) * 2

对此的看法可以概括为:

A(1,3):
    return A(x-1, A(x, y-1)) * 2
    return A(0, A(1, 2)) * 2:
        A(1,2):
            return A(x-1, A(x, y-1)) * 2
            return A(0, A(1, 1)) * 2:
                A(1,1):
                    return A(x-1, A(x, y-1)) * 2
                    return A(0, A(1, 0)) * 2:
                        A(1,0):
                            return A(x-1, 1) + 1
                            return A(0, 1) + 1:
                                A(0,1):
                                    return y+2
                                    return 3
                                3 + 1 = 4
                                return 4
                    return A(0,4) * 2:
                        A(0,4):
                            return y+2
                            return 6
                        6*2 = 12
                    return 12
            return A(0, 12) * 2:
                A(0,12):
                    return y+2
                    return 14
                14*2 = 28
            return 28
    return A(0, 28) * 2:
        A(0,28):
            return y+2
            return 30
        30 * 2 = 60
    return 60

希望“树”可以帮助您可视化正在发生的事情。


2
投票

让我们逐步完成您的程序:

  • 首先,我们调用具有参数1、3的函数A
  • 功能A开始运行,并将x设置为第一个参数1,并将y设置为第二个参数3。
  • 然后继续执行,直到出现第一个if语句。
  • x不为0,因此我们跳到下一个语句,它是第二个if语句。
  • y不为0,因此我们跳到下一条语句,这是对A函数的second调用,其参数为x - 1(其值为0),而A(x, y - 1)为第二个参数。
  • 第二个参数导致对A的anthing]调用,并带有参数1和2。首先进行计算,然后将其结果设置为second调用的第二个参数Asecond
  • 调用命中return语句,并将结果返回对A的first调用。然后将该值乘以2,然后将first调用与然后,A将其值返回到初始print函数,该函数显示数字60。

    这可能很快很难手动跟踪,因此添加print语句或使用调试器会很有帮助。

这是用print语句修改的函数的示例:

def A(x, y):
    print('in A.  x:',x,'y:',y)
    if x == 0:
        return y + 2
    if y == 0:
        return A(x - 1, 1) + 1
    return A(x - 1, A(x, y - 1)) * 2

print(A(1, 3))

将产生以下输出:

in A.  x: 1 y: 3
in A.  x: 1 y: 2
in A.  x: 1 y: 1
in A.  x: 1 y: 0
in A.  x: 0 y: 1
in A.  x: 0 y: 4
in A.  x: 0 y: 12
in A.  x: 0 y: 28
60
© www.soinside.com 2019 - 2024. All rights reserved.