djl931021 发表于 2023-6-2 21:05:34

递归问题求解

def power(x, y):
    if y:
      return x * power(x, y-1)
    else:
      return 1
   
print(power(2, 3))

请问为什么递归中调用的函数自身的x不会*y呢

isdkz 发表于 2023-6-2 21:07:05

这是因为递归函数的工作原理。这里的函数power有两个参数x和y 。当你调用power(2, 3)时,它会返回2 * power(2, 2) 。然后它会继续递归下去, power(2, 2)返回2 * power(2, 1) , power(2, 1)返回2 * power(2, 0) 。最后, power(2, 0)返回1 ,因为函数定义中有一个递归基条件if not y: return 1 。

然后递归开始"回溯",计算每个层级的结果。所以,最后的结果实际上是2 * (2 * (2 * 1)) ,也就是 2 的 3 次方。

这里,每个递归函数调用中的x是函数调用时传入的那个x ,并不是前一次函数调用结果的x * y 。因此, x始终保持不变,而y在每一层的递归中逐渐减小,直到满足终止条件y == 0 。

liuhongrun2022 发表于 2023-6-2 21:17:12

这是因为递归函数中在每次调用时都传入了一个新的参数 y-1,而在第一次调用时的参数 y 只在第一次调用时起作用,因为之后每次调用 power 函数时,都会将 y-1 作为新的参数传入,最终当 y 等于 0 时,函数返回 1。而参数 x 在每次调用函数时保持不变,因此在这个递归函数的实现中,每次调用函数时只对参数 y 进行了修改和传递,而参数 x 始终保持不变。

具体来说,在第一次调用 power(2, 3) 时,函数将执行如下步骤:

if y: 语句判断 y 是否不为 0。由于 y 的值为 3,因此条件成立。

函数返回 x * power(x, y-1) 的结果,即 2 * power(2, 2)。

在第二次调用 power(2, 2) 时,函数将执行以下操作:

if y: 语句判断 y 是否不为 0。由于 y 的值为 2,因此条件成立。

函数返回 x * power(x, y-1) 的结果,即 2 * power(2, 1)。

在第三次调用 power(2, 1) 时,函数将执行以下操作:

if y: 语句判断 y 是否不为 0。由于 y 的值为 1,因此条件成立。

函数返回 x * power(x, y-1) 的结果,即 2 * power(2, 0)。

在第四次调用 power(2, 0) 时,函数将执行以下操作:

if y: 语句判断 y 是否不为 0。由于 y 的值为 0,因此条件不成立。

函数返回 1,作为递归结束的标志。

根据这些步骤可以看出,参数 x 在整个递归过程中始终保持不变,而参数 y 在每次调用函数时都会减少一,并作为新的参数传递给下一次调用。因此,当 y 变为 0 时,函数返回 1,计算完整个幂运算后得到最终结果 8。

zhangjinxuan 发表于 2023-6-2 21:25:19

递归式就是 power(x, y) = x * power(x, y - 1),你想,x * x^y 是不是等于 x^(y+1) 呀?

因此,我们就可以把 x^y 这一个问题拆成 x * x^(y-1) 这个问题。

sfqxx 发表于 2023-6-2 21:38:44

在递归调用中,每次函数调用所接收的参数是不同的,因此每次函数调用中的 x 和 y 的值都不同。

具体来说,在第一次调用 power 函数时,参数为 x=2, y=3。由于 y 不为 0,函数内部会执行 x * power(x, y-1),即 2 * power(2, 2)。在这个递归调用中,power 函数的参数为 x=2, y=2。同样地,此时 y 不为 0,函数内部会执行 x * power(x, y-1),即 2 * power(2, 1)。这个递归调用中,power 函数再次被调用,参数为 x=2, y=1。由于此时 y 仍然不为 0,函数内部会执行 x * power(x, y-1),即 2 * power(2, 0)。在最后一次递归调用中,由于 y 为 0,函数会返回 1。然后,之前的每个递归调用都会依次返回 2 * power(2, 1)、2 * power(2, 2) 和 2 * power(2, 3)。因此,整个程序的输出结果为 8。

在这个过程中,每个函数调用所接收的参数是不同的,因此 x 和 y 的值也不同。总之,每次递归调用时 power 函数内部的乘积运算都会使用不同的参数值进行计算,因此最终结果是正确的。

歌者文明清理员 发表于 2023-6-2 22:20:53

liuhongrun2022 发表于 2023-6-2 21:17
这是因为递归函数中在每次调用时都传入了一个新的参数 y-1,而在第一次调用时的参数 y 只在第一次调用时起 ...

《gpt大军来袭》

liuhongrun2022 发表于 2023-6-3 11:15:44

歌者文明清理员 发表于 2023-6-2 22:20
《gpt大军来袭》

啊这

nmbcnm 发表于 2023-6-3 11:35:26

liuhongrun2022 发表于 2023-6-3 11:15
啊这

啊这
页: [1]
查看完整版本: 递归问题求解