yixinwenxin 发表于 2022-2-21 21:06:12

递归的返回值


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

power(2,3)



问:
x 怎么 幂运算

值存在那?

大马强 发表于 2022-2-21 21:06:13

我将其分为三部分,你看下有啥还不明白的
def power(x, y):
    if y == 0:
      print(f"y == 0 , y : {y} , x : {x}")# 2 部分
      return 1# 2 部分 到y等于时开始退栈 1出开始往下执行
    else:
      print(f"递 : y : {y} , x : {x}")# 1 部分
      x = power(x, y-1) * x# 1 部分:每次执行到这里都会先停一下,调用 power(x, y-1)函数压栈
      """
      x = 1 * 2 第一次调用
      x = 2 * 2 第二次调用
      x = 4 * 2 第三次调用
      """
      print(f"归 : y : {y} , x : {x}")# 3 部分
      return x# 3 部分
      """
      第一次返回 1 给上一次的 power(x, y-1) 退栈
      第二次返回 2 给上一次的 power(x, y-1) 退栈
      第三次返回 4 给上一次的 power(x, y-1) 退栈
      第四次返回 8 栈空 返回主函数
      """


print(power(2, 3))

大马强 发表于 2022-2-21 21:25:11

这样写的话x好像一直不变,
每次递归调用函数都会开辟一块新的空间来存放变量和值
x不是全局变量,新调用的函数中的x不会影响到前边调用函数中的x

傻眼貓咪 发表于 2022-2-21 21:32:15

一般递归函数,值存在栈里,你是看不见的,除非打印每次递归结果,如你的代码。

**栈不是无限大的,所以递归必须要有结束递归的条件,否则如果出现函数无限递归或递归太深就会栈溢出。

yixinwenxin 发表于 2022-2-21 22:07:26

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

想过闭包或全局变量
但... 和 递归好像差那么点意思

大马强 发表于 2022-2-21 22:10:47

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

因为你的函数没有变量能接受返回值,所以x想要改变就要是全局变量

yixinwenxin 发表于 2022-2-21 22:13:20

傻眼貓咪 发表于 2022-2-21 21:32
一般递归函数,值存在栈里,你是看不见的,除非打印每次递归结果,如你的代码。

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

求教
小甲鱼的课后答案我看了   不过理解不了所以来问
我现在 对于递归理解程度   
递-->我理解到必须要有结束条件
归-->求值方面完全不理解

yixinwenxin 发表于 2022-2-21 22:22:17

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

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

isdkz 发表于 2022-2-21 22:40:30

本帖最后由 isdkz 于 2022-2-21 22:41 编辑

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

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

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

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

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

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

这有点类似数学中的反证法

大马强 发表于 2022-2-21 23:09:54

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


能否发下完整代码

大马强 发表于 2022-2-21 23:11:05

是这个吗
def power(x, y):
    if y == 0:
      print(f"y == 0 , y : {y} , x : {x}")
      return 1
    else:
      print(f"递 : y : {y} , x : {x}")
      x = power(x, y-1) * x
      print(f"归 : y : {y} , x : {x}")
      return x


print(power(2, 3))

yixinwenxin 发表于 2022-2-22 00:08:16

大马强 发表于 2022-2-21 23:23
我将其分为三部分,你看下有啥还不明白的

def power(x, y):
    if y == 0:
      print(f"y == 0 , y : {y} , x : {x}")
      return 1
    else:
      print(f"递 : y : {y} , x : {x}")

      """
      递 : y : 2 , x : 4
      递 : y : 1 , x : 4
      """

      y = power(x, y-1) * x
      print(f"归 : y : {y} , x : {x}")
      """
      归 : y : 4 , x : 4
      归 : y : 16 , x : 4
      """
      return y

print(power(y=2,x=4))
"""
16
"""

谢谢
页: [1]
查看完整版本: 递归的返回值