鱼C论坛

 找回密码
 立即注册
查看: 1290|回复: 11

[已解决]递归的返回值

[复制链接]
发表于 2022-2-21 21:06:12 | 显示全部楼层 |阅读模式
10鱼币

  1. # 使用递归编写一个 power() 函数模拟内建函数 pow()
  2. # 即 power(x, y) 为计算并返回 x 的 y 次幂的值
  3. def power(x,y):
  4.     if y == 0:
  5.         print(f"y == 0 , y : {y} , x : {x}")
  6.         return 1,print(f"  ?  y : {y} , x : {x}")
  7.     else:
  8.         print(f"递 : y : {y} , x : {x}")
  9.         power(x,y-1)
  10.         print(f"归 : y : {y} , x : {x}")
  11.         return

  12. power(2,3)
复制代码



问:
x 怎么 幂运算

值存在那?
最佳答案
2022-2-21 21:06:13
我将其分为三部分,你看下有啥还不明白的
  1. def power(x, y):
  2.     if y == 0:
  3.         print(f"y == 0 , y : {y} , x : {x}")  # 2 部分
  4.         return 1  # 2 部分 到y等于时开始退栈 1出开始往下执行
  5.     else:
  6.         print(f"递 : y : {y} , x : {x}")  # 1 部分
  7.         x = power(x, y-1) * x  # 1 部分:每次执行到这里都会先停一下,调用 power(x, y-1)函数压栈
  8.         """
  9.         x = 1 * 2 第一次调用
  10.         x = 2 * 2 第二次调用
  11.         x = 4 * 2 第三次调用  
  12.         """
  13.         print(f"归 : y : {y} , x : {x}")  # 3 部分
  14.         return x  # 3 部分
  15.         """
  16.         第一次返回 1 给上一次的 power(x, y-1) 退栈
  17.         第二次返回 2 给上一次的 power(x, y-1) 退栈
  18.         第三次返回 4 给上一次的 power(x, y-1) 退栈
  19.         第四次返回 8 栈空 返回主函数
  20.         """


  21. print(power(2, 3))
复制代码

最佳答案

查看完整内容

我将其分为三部分,你看下有啥还不明白的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-21 21:06:13 | 显示全部楼层    本楼为最佳答案   
我将其分为三部分,你看下有啥还不明白的
  1. def power(x, y):
  2.     if y == 0:
  3.         print(f"y == 0 , y : {y} , x : {x}")  # 2 部分
  4.         return 1  # 2 部分 到y等于时开始退栈 1出开始往下执行
  5.     else:
  6.         print(f"递 : y : {y} , x : {x}")  # 1 部分
  7.         x = power(x, y-1) * x  # 1 部分:每次执行到这里都会先停一下,调用 power(x, y-1)函数压栈
  8.         """
  9.         x = 1 * 2 第一次调用
  10.         x = 2 * 2 第二次调用
  11.         x = 4 * 2 第三次调用  
  12.         """
  13.         print(f"归 : y : {y} , x : {x}")  # 3 部分
  14.         return x  # 3 部分
  15.         """
  16.         第一次返回 1 给上一次的 power(x, y-1) 退栈
  17.         第二次返回 2 给上一次的 power(x, y-1) 退栈
  18.         第三次返回 4 给上一次的 power(x, y-1) 退栈
  19.         第四次返回 8 栈空 返回主函数
  20.         """


  21. print(power(2, 3))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-21 21:25:11 | 显示全部楼层
这样写的话x好像一直不变,
每次递归调用函数都会开辟一块新的空间来存放变量和值
x不是全局变量,新调用的函数中的x不会影响到前边调用函数中的x
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-21 21:32:15 | 显示全部楼层
一般递归函数,值存在栈里,你是看不见的,除非打印每次递归结果,如你的代码。

**栈不是无限大的,所以递归必须要有结束递归的条件,否则如果出现函数无限递归或递归太深就会栈溢出。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-2-21 22:07:26 | 显示全部楼层
大马强 发表于 2022-2-21 21:25
这样写的话x好像一直不变,
每次递归调用函数都会开辟一块新的空间来存放变量和值
x不是全局变量,新调用 ...

想过闭包  或  全局变量
但... 和 递归  好像差那么点意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-21 22:10:47 | 显示全部楼层
yixinwenxin 发表于 2022-2-21 22:07
想过闭包  或  全局变量
但... 和 递归  好像差那么点意思

因为你的函数没有变量能接受返回值,所以x想要改变就要是全局变量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-2-21 22:13:20 | 显示全部楼层
傻眼貓咪 发表于 2022-2-21 21:32
一般递归函数,值存在栈里,你是看不见的,除非打印每次递归结果,如你的代码。

**栈不是无限大的,所以 ...

求教
小甲鱼的课后答案我看了   不过理解不了所以来问
我现在 对于递归理解程度   
递  -->  我理解到  必须要有结束条件
归  -->  求值方面完全不理解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-2-21 22:22:17 | 显示全部楼层
大马强 发表于 2022-2-21 22:10
因为你的函数没有变量能接受返回值,所以x想要改变就要是全局变量

不讨论全局变量能解决的问题
递  -->  我理解到  必须要有结束条件
归  --> 求值 完全不理解
麻烦您讲讲  弹出栈它是怎么求值的
答案我看了
只是想要把
  1. return power(x,y-1) * x
复制代码

这句变成自己能理解的意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-21 22:40:30 | 显示全部楼层
本帖最后由 isdkz 于 2022-2-21 22:41 编辑

递归必须有递过去,归回来

递过去:函数调用自身
归回来:函数不能无终止的递下去,所以必须有一个可以被满足的条件,而且满足这个条件了就不再往下递

递归求值是得利用里层归回给外层的值来进行某种确定的运算,

也就是说最里层返回的是一个确定的值用来逆推,而其它层的返回值是某种确定的规则,

它一直递下去,直到获取到最里层的确定的值开始往外归,每一层都等待着里层归回来的数值按照确定的规则往外归,

直到归到最外层,函数调用栈结束,

这有点类似数学中的反证法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-21 23:09:54 | 显示全部楼层
yixinwenxin 发表于 2022-2-21 22:22
不讨论全局变量能解决的问题
递  -->  我理解到  必须要有结束条件
归  --> 求值 完全不理解

能否发下完整代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-21 23:11:05 | 显示全部楼层
是这个吗
  1. def power(x, y):
  2.     if y == 0:
  3.         print(f"y == 0 , y : {y} , x : {x}")
  4.         return 1
  5.     else:
  6.         print(f"递 : y : {y} , x : {x}")
  7.         x = power(x, y-1) * x
  8.         print(f"归 : y : {y} , x : {x}")
  9.         return x


  10. print(power(2, 3))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-2-22 00:08:16 | 显示全部楼层
大马强 发表于 2022-2-21 23:23
我将其分为三部分,你看下有啥还不明白的

  1. def power(x, y):
  2.     if y == 0:
  3.         print(f"y == 0 , y : {y} , x : {x}")
  4.         return 1
  5.     else:
  6.         print(f"递 : y : {y} , x : {x}")

  7.         """
  8.         递 : y : 2 , x : 4
  9.         递 : y : 1 , x : 4
  10.         """

  11.         y = power(x, y-1) * x
  12.         print(f"归 : y : {y} , x : {x}")
  13.         """
  14.         归 : y : 4 , x : 4
  15.         归 : y : 16 , x : 4
  16.         """
  17.         return y

  18. print(power(y=2,x=4))
  19. """
  20. 16
  21. """
复制代码


谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-14 06:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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