鱼C论坛

 找回密码
 立即注册
查看: 1872|回复: 8

[已解决]递归问题求解

[复制链接]
发表于 2023-6-2 21:05:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

请问为什么递归中调用的函数自身的x不会*y呢
最佳答案
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 。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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 。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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。

点评

我很赞同!: 5.0
我很赞同!: 5
  发表于 2023-6-2 21:24
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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) 这个问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 函数内部的乘积运算都会使用不同的参数值进行计算,因此最终结果是正确的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

《gpt大军来袭》
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-3 11:15:44 | 显示全部楼层

啊这
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-3 11:35:26 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-27 10:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表