鱼C论坛

 找回密码
 立即注册
查看: 1710|回复: 3

[已解决]一个简单的递归问题

[复制链接]
发表于 2022-9-30 16:53:29 | 显示全部楼层 |阅读模式

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

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

x
目的是求一个大于一的数的阶乘,我写的如下:
def func(n,result=1):
    if n>1:
        result=result*n
        n=n-1
        func(n,result)
    else:
        return result

为什么这个程序没有返回值啊
我敲下来func(10),回车以后并没有任何返回值,这是为何
最佳答案
2022-9-30 20:52:14
没有返回值是两方面的原因造成的。
1. 在非交互式环境下,函数的返回值不使用类似print函数输出是不会主动显示的。我们在文件中写下这样的代码:
  1. import random

  2. random.random()  # 不使用print,没有任何结果
  3. print(random.random()  # 使用print,输出结果
复制代码
运行这个文件你会发现只输出了一个结果,因为第一次调用random.random()时没有使用print把结果输出到控制台,所以看不到了。如果你在IDLE这样的交互式环境中还是会看到两个输出结果,因为IDLE会主动输出每行的结果。

2. 第二个原因是你的代码漏掉了一个return,如此一来当if分支的语句执行完毕后函数func会默认返回None(没有使用return语句或者只有一个return的时候都返回None),如果返回值为None即使IDLE也不会显示这个结果,所以让你误以为没有返回值了。要想看到这个结果就需要手动使用print函数把结果输出到控制台上,也就是print(func(10)),如此一来你会看到输出结果为None。不过这显然不是你想要的结果,而且我之前也说过了,你漏掉了一个return语句。修改后的代码如下:
  1. def func(n, result=1):
  2.     if n > 1:
  3.         result = result * n
  4.         n = n - 1
  5.         return func(n, result)  # 注意这里添加了一个return
  6.     else:
  7.         return result
复制代码
这样一来,再次使用print(func(10))你就会看到想要的结果了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-9-30 17:50:39 | 显示全部楼层
jackz007 发表于 2022-9-30 17:07
作为一个有返回值的函数, return 永远不可以被 if 所左右,就是说,return 不可以放入 if 语句, ...

return可以放在if语句里面啊,我试了一下可以返回的

另外我的这个程序是在交互模式里面打的,按理说return是可以直接返回值的
我又把这一段程序复制粘贴到编辑器模式里,加上print就可以正常显示了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-30 18:19:38 | 显示全部楼层
jackz007 发表于 2022-9-30 18:10
那你为什么又来求助呢?
         我不是说 return 写在 if 后面不行,只要条件适合,任何被 ...

不是呀,我这个程序没有漏掉return啊,我的原本程序的意思是if条件不满足后执行return语句,输出结果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-30 20:52:14 | 显示全部楼层    本楼为最佳答案   
没有返回值是两方面的原因造成的。
1. 在非交互式环境下,函数的返回值不使用类似print函数输出是不会主动显示的。我们在文件中写下这样的代码:
  1. import random

  2. random.random()  # 不使用print,没有任何结果
  3. print(random.random()  # 使用print,输出结果
复制代码
运行这个文件你会发现只输出了一个结果,因为第一次调用random.random()时没有使用print把结果输出到控制台,所以看不到了。如果你在IDLE这样的交互式环境中还是会看到两个输出结果,因为IDLE会主动输出每行的结果。

2. 第二个原因是你的代码漏掉了一个return,如此一来当if分支的语句执行完毕后函数func会默认返回None(没有使用return语句或者只有一个return的时候都返回None),如果返回值为None即使IDLE也不会显示这个结果,所以让你误以为没有返回值了。要想看到这个结果就需要手动使用print函数把结果输出到控制台上,也就是print(func(10)),如此一来你会看到输出结果为None。不过这显然不是你想要的结果,而且我之前也说过了,你漏掉了一个return语句。修改后的代码如下:
  1. def func(n, result=1):
  2.     if n > 1:
  3.         result = result * n
  4.         n = n - 1
  5.         return func(n, result)  # 注意这里添加了一个return
  6.     else:
  7.         return result
复制代码
这样一来,再次使用print(func(10))你就会看到想要的结果了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 23:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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