递归的返回值
# 使用递归编写一个 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 怎么 幂运算
值存在那?
我将其分为三部分,你看下有啥还不明白的
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)) 这样写的话x好像一直不变,
每次递归调用函数都会开辟一块新的空间来存放变量和值
x不是全局变量,新调用的函数中的x不会影响到前边调用函数中的x 一般递归函数,值存在栈里,你是看不见的,除非打印每次递归结果,如你的代码。
**栈不是无限大的,所以递归必须要有结束递归的条件,否则如果出现函数无限递归或递归太深就会栈溢出。 大马强 发表于 2022-2-21 21:25
这样写的话x好像一直不变,
每次递归调用函数都会开辟一块新的空间来存放变量和值
x不是全局变量,新调用 ...
想过闭包或全局变量
但... 和 递归好像差那么点意思 yixinwenxin 发表于 2022-2-21 22:07
想过闭包或全局变量
但... 和 递归好像差那么点意思
因为你的函数没有变量能接受返回值,所以x想要改变就要是全局变量 傻眼貓咪 发表于 2022-2-21 21:32
一般递归函数,值存在栈里,你是看不见的,除非打印每次递归结果,如你的代码。
**栈不是无限大的,所以 ...
求教
小甲鱼的课后答案我看了 不过理解不了所以来问
我现在 对于递归理解程度
递-->我理解到必须要有结束条件
归-->求值方面完全不理解 大马强 发表于 2022-2-21 22:10
因为你的函数没有变量能接受返回值,所以x想要改变就要是全局变量
不讨论全局变量能解决的问题
递-->我理解到必须要有结束条件
归--> 求值 完全不理解
麻烦您讲讲弹出栈它是怎么求值的
答案我看了
只是想要把
return power(x,y-1) * x
这句变成自己能理解的意思 本帖最后由 isdkz 于 2022-2-21 22:41 编辑
递归必须有递过去,归回来
递过去:函数调用自身
归回来:函数不能无终止的递下去,所以必须有一个可以被满足的条件,而且满足这个条件了就不再往下递
递归求值是得利用里层归回给外层的值来进行某种确定的运算,
也就是说最里层返回的是一个确定的值用来逆推,而其它层的返回值是某种确定的规则,
它一直递下去,直到获取到最里层的确定的值开始往外归,每一层都等待着里层归回来的数值按照确定的规则往外归,
直到归到最外层,函数调用栈结束,
这有点类似数学中的反证法
yixinwenxin 发表于 2022-2-21 22:22
不讨论全局变量能解决的问题
递-->我理解到必须要有结束条件
归--> 求值 完全不理解
能否发下完整代码 是这个吗
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)) 大马强 发表于 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]