鱼C论坛

 找回密码
 立即注册
查看: 1742|回复: 9

[已解决]小甲鱼的代码看不懂

[复制链接]
发表于 2020-8-26 09:44:17 | 显示全部楼层 |阅读模式

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

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

x
为什么第二行就一个 if y:,这是要函数满足什么条件? 还有return里面是如何完成2**3的?
最佳答案
2020-8-26 09:52:33
本帖最后由 sunrise085 于 2020-8-26 10:01 编辑

你要好好学习一下基础啊!
if后面是一个表达式,只要表达式为真则执行if后的语句,为假则执行else后面的语句
表达式为假的情况如下:表达式结果为逻辑假:False,数字零:0、0.0,空类型:[]、""、{}等等

2**3的执行过程:
第一次进入power函数,执行的时候if判断,y为3,为真,执行if后的语句
return x * power(x ,  y - 1),这时先递归调用 power(x ,  y - 1)
        第二次进入power函数,执行的时候if判断,y为2,为真,执行if后的语句
        return x * power(x ,  y - 1),这时先递归调用 power(x ,  y - 1)
                第三次进入power函数,执行的时候if判断,y为1,为真,执行if后的语句
                return x * power(x ,  y - 1),这时先递归调用 power(x ,  y - 1)
                        第四次进入power函数,执行的时候if判断,y为0,为假,执行else后的语句
                        return 1,返回到第三次调用
                第三次递归是power(x ,  y - 1)结果为1,return x*1,即 return 2,返回到第二次调用
        第二次递归是power(x ,  y - 1)结果为2,return x*2,即 return 4,返回到第一次调用
第一次递归是power(x ,  y - 1)结果为4,return x*4,即 return 8,返回函数调用结果
最终得到8
       
截屏2020-08-26 上午9.41.40.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-26 09:50:31 | 显示全部楼层
当y>0的时候,判断执行:if后面的内容->y个x相乘
当y等于0,执行else,返回1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-8-26 09:51:24 | 显示全部楼层
def power(x, y):
     if y:
         return x * power(x, y-1)
     else:
         return 1
这里的return 1很重要,return 1是说y=0时函数运行结果返回1,这个y-1总会等于0,那么我们就从0开始倒着算,
如果参数是2,4,你可以把这个过程分解为:
y=0那次执行函数返回1;
y=1那次返回的是2*1 = 2;
y=2那次返回的是2*(2*1) = 4;此处加括号为了看起来明了。
y=3那次返回的是2*(2*(2*1)) = 8;
y=4那次返回的是2*(2*(2*(2*1))) = 16。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-8-26 09:52:33 | 显示全部楼层    本楼为最佳答案   
本帖最后由 sunrise085 于 2020-8-26 10:01 编辑

你要好好学习一下基础啊!
if后面是一个表达式,只要表达式为真则执行if后的语句,为假则执行else后面的语句
表达式为假的情况如下:表达式结果为逻辑假:False,数字零:0、0.0,空类型:[]、""、{}等等

2**3的执行过程:
第一次进入power函数,执行的时候if判断,y为3,为真,执行if后的语句
return x * power(x ,  y - 1),这时先递归调用 power(x ,  y - 1)
        第二次进入power函数,执行的时候if判断,y为2,为真,执行if后的语句
        return x * power(x ,  y - 1),这时先递归调用 power(x ,  y - 1)
                第三次进入power函数,执行的时候if判断,y为1,为真,执行if后的语句
                return x * power(x ,  y - 1),这时先递归调用 power(x ,  y - 1)
                        第四次进入power函数,执行的时候if判断,y为0,为假,执行else后的语句
                        return 1,返回到第三次调用
                第三次递归是power(x ,  y - 1)结果为1,return x*1,即 return 2,返回到第二次调用
        第二次递归是power(x ,  y - 1)结果为2,return x*2,即 return 4,返回到第一次调用
第一次递归是power(x ,  y - 1)结果为4,return x*4,即 return 8,返回函数调用结果
最终得到8
       
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-8-26 10:28:41 | 显示全部楼层
学到了递归就不应该对布尔类型还存在模糊印象了,各种判断语句中后面跟的都是返回布尔类型语句,比如a>b返回的不是True就是False,同样的,对于数字而言,0就是FALSE,非零就是TRUE,至于后面的问题,因为这不是特别深层次的递归,你可以跟着算一下,递归的难点在于对问题的拆分,如果不是特别需要的话主要就是掌握几个常用的就好了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-8-26 10:38:53 | 显示全部楼层
我们知道if 后面跟的是判断的条件,其实小甲鱼的视频也有讲过(印象中是有的),就是判断条件(即if y中的y)是数字的时候,只有当y==0时 if y中y为false 当y != 0时,if y中 y为true
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-8-26 10:50:03 | 显示全部楼层
sunrise085 发表于 2020-8-26 09:52
你要好好学习一下基础啊!
if后面是一个表达式,只要表达式为真则执行if后的语句,为假则执行else后面的语 ...

那2*3是如何实现的?【 x*power(x, y-1)】中 *后面不是一个式子吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-26 10:58:03 | 显示全部楼层
阿九。 发表于 2020-8-26 10:50
那2*3是如何实现的?【 x*power(x, y-1)】中 *后面不是一个式子吗



那来的2*3??2*3不就是6吗?
2**3吧? ** 是幂运算,  *是乘法运算
【 x*power(x, y-1)】 *后面是个函数调用,可以说算是一个式子,所以需要先计算该式子得出结果,然后在于前面的 x 相乘啊。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-8-26 11:02:55 | 显示全部楼层
sunrise085 发表于 2020-8-26 10:58
那来的2*3??2*3不就是6吗?
2**3吧? ** 是幂运算,  *是乘法运算
【 x*power(x, y-1 ...

可式子里执行什么?  不是并没有告诉Python执行什么吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-26 11:07:10 | 显示全部楼层
阿九。 发表于 2020-8-26 11:02
可式子里执行什么?  不是并没有告诉Python执行什么吗

最后再回答你一次。
power(x ,  y-1) 是函数调用,其中x为2,y为3,也就是power(2 , 2)
你不要再提问了。回去好好看看基础知识吧。
不是我说你,你问的问题真的有点太基础了。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-19 03:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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