鱼C论坛

 找回密码
 立即注册
查看: 48|回复: 4

python 第一版 22课 课后题

[复制链接]
发表于 昨天 16:08 | 显示全部楼层 |阅读模式

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

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

x
使用递归编写一个 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 的关系怎么弄的呀

求大佬回答  我困一天了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 昨天 16:09 | 显示全部楼层
关于递归和迭代两种实现方式,我来帮你一步步分析:

一、递归版本解析:
  1. def power(x, y):
  2.     if y:        # 当y不为0时(Python中0为False)
  3.         return x * power(x, y-1)  # 关键点:拆解为 x * (x的y-1次方)
  4.     else:
  5.         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 → 最终结果

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


关键点:
1. range(y) 生成 [0, 1, ..., y-1] 共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 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 昨天 17:20 | 显示全部楼层
1,x的y次方就是x*x的y-1次方,对吧

2,range()几就执行几次,因为从零开始
所以把x乘y次方就是乘y个x
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 20:41 | 显示全部楼层
某一个“天” 发表于 2025-7-16 17:20
1,x的y次方就是x*x的y-1次方,对吧

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

可是之前讲课**不是次方吗?
我记得*是乘法
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 23:05 | 显示全部楼层
qasa 发表于 2025-7-16 20:41
可是之前讲课**不是次方吗?
我记得*是乘法

对啊
剩下是数学知识
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-17 09:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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