鱼C论坛

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

问题描述:递归计算阶乘

[复制链接]
发表于 2021-2-22 19:17:16 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 流泪的鳄鱼 于 2021-2-22 19:18 编辑

  1 #include<stdio.h>
  2 long int fun(int a){
  3         int temp = 0;
  4         static long int b = 1;
  5         temp = a;
  6         if(temp <= 1){
  7                 return b;
  8         }
  9         else{
10                 b = temp *b;
11                 fun((temp--));
12         }
13 }
14 int main()
15 {
16         int a = 0;
17         printf("请输入一个整数:\n");
18         scanf("%d",&a);;
19         printf("%d! = %ld\n",a,fun(a));
20         return 0;
21 }
~                             
报错:段错误(核心已转储)                                                                                                                                      
1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-2-22 19:30:48 | 显示全部楼层
简单点
  1. #include<stdio.h>

  2. long int fun(int a)
  3. {
  4.         if(a <= 1)
  5.         {
  6.                 return 1;
  7.         }
  8.         else
  9.         {
  10.                 return a * fun(a-1);
  11.         }
  12. }
  13. int main()
  14. {
  15.         int a = 0;
  16.         printf("请输入一个整数:\n");
  17.         scanf("%d",&a);;
  18.         printf("%d! = %ld\n",a,fun(a));
  19.         return 0;
  20. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-22 19:38:39 | 显示全部楼层
你的代码就一点小问题
temp-- 改成 --temp
至于为什么,可以仔细想想这两个的差别
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-22 19:55:41 | 显示全部楼层
  1. fun((temp--));
复制代码
死递归
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-23 10:13:00 | 显示全部楼层
李京 发表于 2021-2-22 19:38
你的代码就一点小问题
temp-- 改成 --temp
至于为什么,可以仔细想想这两个的差别

这两个差别我知道,我认为是temp在函数中作为局部变量造成的,但是我觉得这种解释不够透彻
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-23 10:14:03 | 显示全部楼层

我认为是temp在函数中作为局部变量造成的,但是我觉得这种解释不够透彻,是这个造成的死递归吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-23 10:41:09 | 显示全部楼层
本帖最后由 李京 于 2021-2-23 10:46 编辑
流泪的鳄鱼 发表于 2021-2-23 10:14
我认为是temp在函数中作为局部变量造成的,但是我觉得这种解释不够透彻,是这个造成的死递归吗?


不是temp是局部变量的问题

fun(temp--)  
temp-- 自减要下一条语句才生效
可以换成temp-1 或者 --temp
都可以

你传入的值一直是你刚输入的值,你觉得是不是一直在递归

你可以自己试着一条一条语句的执行

第一次递归  temp=a

然后你传入下一次递归的值是  temp(temp 就是 a的值) 并不是 temp-1
因为temp--要下一条语句才执行自减
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-23 17:38:14 | 显示全部楼层
流泪的鳄鱼 发表于 2021-2-23 10:14
我认为是temp在函数中作为局部变量造成的,但是我觉得这种解释不够透彻,是这个造成的死递归吗?

每次递归传的都是一样的参数,就成死递归了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-24 18:58:45 | 显示全部楼层
李京 发表于 2021-2-23 10:41
不是temp是局部变量的问题

fun(temp--)  

懂了,非常感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-24 18:59:16 | 显示全部楼层
永恒的蓝色梦想 发表于 2021-2-23 17:38
每次递归传的都是一样的参数,就成死递归了

懂了,非常感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 06:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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