qasa 发表于 2025-7-16 16:08:30

python 第一版 22课 课后题

使用递归编写一个 power() 函数模拟内建函数 pow(),即 power(x, y) 为计算并返回 x 的 y 次幂的值。
小甲鱼老师的答案是
def power(x, y):
    if y:
      return x * power(x, y-1)
    else:
      return 1
   
print(power(2, 3))

这里我看不懂的是    return x*power(x,y-1)   这是怎么乘除的啊没看懂
小甲鱼老师给的是递归的,但是我想要迭代的,下面是我同学教我的迭代的 还是看不懂发求助

def power(x,y):
    result = 1
    for i in range(y):
      result *= x
    return result

这里我搞不懂的是    for i in rang(y)    和   return *= x    的关系

下面是我的理解
第一行是设置函数poweer(x,y)
第二行是设置一个初始值为1的数字
第三行是for循环把 i 插入进去使得 y 这个数字从   0   开始到   y-1
第四行是x总结果 = 1 * x
第五行是返回值
我感觉这代码运行不了但是它可以 x y 的关系怎么弄的呀

求大佬回答我困一天了

FishC 发表于 2025-7-16 16:09:44

关于递归和迭代两种实现方式,我来帮你一步步分析:

一、递归版本解析:
def power(x, y):
    if y:      # 当y不为0时(Python中0为False)
      return x * power(x, y-1)# 关键点:拆解为 x * (x的y-1次方)
    else:
      return 1# y=0时返回1(任何数的0次方等于1)

计算过程示例(2的3次方):
1. power(2,3) → 2 * power(2,2)
2. power(2,2) → 2 * power(2,1)
3. power(2,1) → 2 * power(2,0)
4. power(2,0) → 1
↑ 递归展开结束,开始返回 ↓
3. 2 * 1 = 2
2. 2 * 2 = 4
1. 2 * 4 = 8 → 最终结果

二、迭代版本解析:
def power(x, y):
    result = 1          # 初始化结果为1(应对y=0的情况)
    for i in range(y):# 循环y次(如y=3则循环3次)
      result *= x   # 等价于 result = result * x
    return result

关键点:
1. range(y) 生成 共y个数字
2. 循环次数 = y的值(与i的具体数值无关)
3. result *= x 表示每次循环将当前结果乘以x

计算流程(2的3次方):

循环次数i的值result变化过程
初始-result = 1
第1次0result = 1*2 = 2
第2次1result = 2*2 = 4
第3次2result = 4*2 = 8


三、你的理解修正:
> 第四行是 x总结果 = 1 * x
这里需要修正:result *= x 不是直接用1乘x,而是用当前result的值乘x
第一次:result = 1 * x
第二次:result = (1*x) * x
第三次:result = (1*x*x) * x
...
第y次:result = x^y

四、对比总结:

[*]递归:通过函数自我调用分解问题(从y到0)
[*]迭代:通过循环累乘解决问题(从1开始乘y次)


两种方法都正确,迭代版本更直观且效率更高(递归有深度限制)。建议用迭代版本,理解后可以自己写个计算过程表验证!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

某一个“天” 发表于 2025-7-16 17:20:15

1,x的y次方就是x*x的y-1次方,对吧

2,range()几就执行几次,因为从零开始
所以把x乘y次方就是乘y个x

qasa 发表于 2025-7-16 20:41:38

某一个“天” 发表于 2025-7-16 17:20
1,x的y次方就是x*x的y-1次方,对吧

2,range()几就执行几次,因为从零开始


可是之前讲课**不是次方吗?
我记得*是乘法

某一个“天” 发表于 2025-7-16 23:05:15

qasa 发表于 2025-7-16 20:41
可是之前讲课**不是次方吗?
我记得*是乘法

对啊
剩下是数学知识

学数学的混子 发表于 7 天前

某一个“天” 发表于 2025-7-16 17:20
1,x的y次方就是x*x的y-1次方,对吧

2,range()几就执行几次,因为从零开始


我觉得可以给个最佳{:7_146:}
页: [1]
查看完整版本: python 第一版 22课 课后题