鱼C论坛

 找回密码
 立即注册
查看: 1874|回复: 20

[已解决]问一问关于函数的问题

[复制链接]
发表于 2021-3-13 11:16:27 | 显示全部楼层 |阅读模式

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

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

x
def xiatiya(a,b):
    if a >= b:
        xiatiya(a//b,b)
    print(a%b,end = '')
a = int(input())
b = int(input())
xiatiya(a,b)
最后的输出为什么不是1,函数反复调用后才会print结果呀,所以print应该只有一个数,但是答案上是10000011
最佳答案
2021-3-13 22:16:28
简单做了个图示,希望你能看懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-3-13 11:19:11 | 显示全部楼层
不满足 if a >= b就会打印,并且end=''

所以你看到的是一个一个打印出来的内容

拼接成了最后的10000011
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-13 11:26:19 | 显示全部楼层
逃兵 发表于 2021-3-13 11:19
不满足 if a >= b就会打印,并且end=''

所以你看到的是一个一个打印出来的内容

那为什么不是1呢,换句话问,我觉得应该只会打印出不满足的那个时候的值,为啥会打印那么多出来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-13 11:29:01 | 显示全部楼层
Jerry~Mouse 发表于 2021-3-13 11:26
那为什么不是1呢,换句话问,我觉得应该只会打印出不满足的那个时候的值,为啥会打印那么多出来

a和b各是多少
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-13 11:30:35 | 显示全部楼层

a=131 b=2
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-13 11:50:34 | 显示全部楼层
def xiatiya(a,b):
    if a >= b:
        xiatiya(a//b,b)
    print(a%b,end = '')
我们看xiatiya这个函数
if和print()在同一个缩进上
就是不论执不执行if中的内容,最终都会print()

xiatiya(131,2)
相当于执行
xiatiya(65,2)
print(131%2,end='')
相当于
xiatiya(32,2)
print(65%2,end='')
print(131%2,end='')
相当于
xiatiya(16,2)
print(32%2,end='')
print(65%2,end='')
print(131%2,end='')
相当于
xiatiya(8,2)
print(16%2,end='')
print(32%2,end='')
print(65%2,end='')
print(131%2,end='')
相当于
xiatiya(4,2)
print(8%2,end='')
print(16%2,end='')
print(32%2,end='')
print(65%2,end='')
print(131%2,end='')
相当于
xiatiya(2,2)
print(4%2,end='')
print(8%2,end='')
print(16%2,end='')
print(32%2,end='')
print(65%2,end='')
print(131%2,end='')
相当于
xiatiya(1,2)
print(2%2,end='')
print(4%2,end='')
print(8%2,end='')
print(16%2,end='')
print(32%2,end='')
print(65%2,end='')
print(131%2,end='')
相当于
print(1%2,end='')
print(2%2,end='')
print(4%2,end='')
print(8%2,end='')
print(16%2,end='')
print(32%2,end='')
print(65%2,end='')
print(131%2,end='')

结果
10000011
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-3-13 12:04:05 | 显示全部楼层
逃兵 发表于 2021-3-13 11:50
我们看xiatiya这个函数
if和print()在同一个缩进上
就是不论执不执行if中的内容,最终都会print()

那我if里面的东西还没执行完呀,if执行的时候是一直在调用函数的,还没有到print就调用函数了,一直如此,直到最后了再打印一个1,为啥会有那么多print呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-13 12:13:07 | 显示全部楼层
Jerry~Mouse 发表于 2021-3-13 12:04
那我if里面的东西还没执行完呀,if执行的时候是一直在调用函数的,还没有到print就调用函数了,一直如此 ...

最后打印一个1以后,相当于那个if执行完了,就会执行后面的print
这又不是一个死循环,只是先执行内部print再执行外部的print
最终只要if能结束,就会有对应的print
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-13 12:20:36 | 显示全部楼层
还不理解的话
我们执行简单的
def xiatiya(a,b):
    if a >= b:
        xiatiya(a//b,b)
    print(a%b,end = '')
>>> xiatiya(2,2)
10

这里2 == 2满足条件
相当于
xiatiya(1,2)
print(2%2,end = '')

xiatiya(1,2)会打印1
此时if执行完毕,执行print(2%2,end = '')

最终得到10
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-13 16:47:09 | 显示全部楼层
逃兵 发表于 2021-3-13 12:20
还不理解的话
我们执行简单的

我还是很不理解,我说说我理解的逻辑吧
xiatiya(131,2)
此时131>2;判定成立
变成了xiatiya(65,2);判定成立
变成了xiatiya(32,2);判定成立
变成了xiatiya(16,2);判定成立
变成了xiatiya(8,2);判定成立
变成了xiatiya(4,2);判定成立
变成了xiatiya(2,2);判定成立
变成了xiatiya(1,2);判定不成立;退出if
然后print(1%2)
打印出1
也就是我认为只会出现一个print,因为print在后面,还没有print的时候if成立的话就一直调用函数,直到if不成立了才会轮到print
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-13 16:56:18 | 显示全部楼层
if成立的话就一直调用函数,没错

但是print()也存在于被调用函数中,调用函数必然会出现这个函数的print

你在每一次调用的时候,都会有一次print
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-3-13 20:11:37 | 显示全部楼层
如图:

                               
登录/注册后可看大图

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-13 20:14:04 | 显示全部楼层
如图:
屏幕截图 2021-03-13 201310.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-3-13 21:57:33 | 显示全部楼层

这个print难道不是和if同级别的吗,为什么会待执行呢,为啥不是不执行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-13 21:59:30 | 显示全部楼层
逃兵 发表于 2021-3-13 16:56
if成立的话就一直调用函数,没错

但是print()也存在于被调用函数中,调用函数必然会出现这个函数的print ...

print在函数之后呀,函数没有执行完,print也不会有作用,待执行是为什么呢,既然都没有轮到print这个语句,它为什么会待执行呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-13 22:00:04 | 显示全部楼层

print在函数之后呀,函数没有执行完,print也不会有作用,待执行是为什么呢,既然都没有轮到print这个语句,它为什么会待执行呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-13 22:09:41 | 显示全部楼层
Jerry~Mouse 发表于 2021-3-13 22:00
print在函数之后呀,函数没有执行完,print也不会有作用,待执行是为什么呢,既然都没有轮到print这个语 ...
def xiatiya(a,b):
    if a >= b:
        xiatiya(a//b,b)
    print(a%b,end = '')
根据上面的代码,函数xiatiya()包含两条语句,一条是if,一条是print。因为没有break,所以只要调用xiatiya(),就一定会执行if和print。按照顺序执行if的时候,调用下级函数,这时if后面的print语句就暂时挂起,等待if执行完再执行print,所以会有N个print语句待执行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-13 22:16:28 | 显示全部楼层    本楼为最佳答案   
简单做了个图示,希望你能看懂
新建位图图像.bmp
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-3-14 16:51:41 | 显示全部楼层
atai0622 发表于 2021-3-13 22:16
简单做了个图示,希望你能看懂

牛!我明白了,这个图我看懂了,谢谢谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-14 17:02:24 | 显示全部楼层
你if的条件判断会依次判断,如果不满足就会打印end=,所以你的打印结果会这个样子,你应该换一个方式,如果他满足或者不满足再打印,反正不输出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-16 06:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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