鱼C论坛

 找回密码
 立即注册
查看: 4013|回复: 14

看不懂递归的调试方法

[复制链接]
发表于 2012-10-15 11:38:10 | 显示全部楼层 |阅读模式

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

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

x
#include <stdio.h>
int dg(int x);
void main()
{
int a;
scanf("%d",&a);
a=dg(a);
printf("%d \n",a);
}
int dg(int x)
{
int i;
if(x==0||x==1)
{
  i=1;
}
else if(x<0)
{
  printf("NO \n");
}
else
{
  i=x*dg(x-1);
}
return i;
}


循环调用自身 当x==1时;i=1这时候条件判断完成 为什么不直接返回i的值
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-10-15 12:45:32 | 显示全部楼层
这是阶乘。。。0的阶乘和1的阶乘都是 1 ,当递归到一个最小“量”时,即是(x-1)=1的时候就不需要再递归了。。第一次回答这样的问题 希望我说的你懂
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-10-15 13:03:01 | 显示全部楼层
递归比较抽象,多看下视频吧
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-10-15 13:21:58 | 显示全部楼层

你讲的是我上面的代码 代码我懂 但是调试过程不太懂 当x==1时;i=1这时候条件判断完成 为什么不直接返回i的值
而此时的程序是在
else
{
  i=x*dg(x-1);
}
return i;
之间循环判断  且i并被重新赋值
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-10-15 13:24:11 | 显示全部楼层
xsx 发表于 2012-10-15 13:03
递归比较抽象,多看下视频吧

谢谢回复 视频中没有讲解 我想这个是不是看汇编代码直观些 现在纠结为了这个算法学汇编还是先这样稀里糊涂学完C下去 最好有人帮我搞懂
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-10-15 13:32:47 | 显示全部楼层
suntan_123 发表于 2012-10-15 12:45
这是阶乘。。。0的阶乘和1的阶乘都是 1 ,当递归到一个最小“量”时,即是(x-1)=1的时候就不需要再递归了 ...

当程序中else语句i=x*dg(x-1)中的x==2时
调用自身程序dg(x)此中的x==1
下面执行判断语句if(x==0||x==1)成立!
执行i=1;
我的理解是此时子程序应该结束 返回值i==1;
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-10-15 15:01:18 | 显示全部楼层
原来如此。 发表于 2012-10-15 13:21
你讲的是我上面的代码 代码我懂 但是调试过程不太懂 当x==1时;i=1这时候条件判断完成 为什么不直接返回i ...

if
{}
else if
{}
else
{}
这个你没有看懂吧  这是一个整体的语句
如果x ==0 或者 x==1只执行第一个 其它的条件不执行 就是说 这三个花括号 只有一个花括号 中的语句 被执行?
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-10-15 15:02:14 | 显示全部楼层
没有重复执行  兄弟!!!
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-10-15 15:50:05 | 显示全部楼层

if(x==0||x==1)
{
   i=1;
}
当执行这条语句的时候
直接跳转至return i;
返回值为1;
为什么返回结果是阶乘的值
这样说是不是好理解点。。。。。
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-10-15 16:19:55 | 显示全部楼层
想通了 返回值返回给的是程序的上一层  调用自身也一样
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-10-15 16:45:44 | 显示全部楼层
我连循环我都没摆脱,别说递归了,慢慢学习中
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-10-15 18:20:49 | 显示全部楼层
原来如此。 发表于 2012-10-15 16:19
想通了 返回值返回给的是程序的上一层  调用自身也一样

郝斌的数据结构有讲递归 看看吧
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-10-15 19:15:05 | 显示全部楼层
#include <stdio.h>
int dg(int x);
void main()
{
        int a;
        scanf("%d",&a);//这里键盘录入赋值给a.
        a=dg(a);//调用函数dg
        printf("%d \n",a);
}
int dg(int x)
{
        int i;//这里i应该赋初值,否则在返回值的时候会发生以外,可以在输入的时候输入负数
        if(x==0||x==1)//简单通俗的讲,这一步是在判断x的值,当x为0或者1时,返回一个数值,赋值给主函数中的a!
        {
                i=1;
        }
        else if(x<0)//若果x小于另!在屏幕打印出一个NO!
        {
                printf("NO \n");//i的值也可以在这里赋值,你自己可以知道看到这个返回的i值,证明自己输入的是负数
        }
        else
        {
                i=x*dg(x-1);//精华所在,函数调用,没调用一次自身,x的值减1,可能迷茫在为什么x的值会递减!调试会给你一个惊喜
        }
        return i;//返回i的值.
}

吃饭去了,才回来,对不住了,没能第一时间回答你的问题
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-10-15 19:15:51 | 显示全部楼层
原来如此。 发表于 2012-10-15 13:24
谢谢回复 视频中没有讲解 我想这个是不是看汇编代码直观些 现在纠结为了这个算法学汇编还是先这样稀里糊涂 ...

你所纠结的 x==1时 i=1判断完成为什么不返回 i的值,,,其实返回了,返回到调用它的函数。就这样一层层向上返,     

你既然想把C语言学好,汇编肯定也要学的,实在不明白多做练习,也可以有所领悟
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-10-15 23:43:40 | 显示全部楼层
其实楼上已经有朋友说的很好了,既然你提出问题,我就再次解释下好了!
这个代码的主要意思是执行阶乘

首先dg函数 接受一个参数,参数由用户自己输入。这里就不啰嗦了。
接着  进行判断。一般来说 递归中,绝对有判断语句,因为要给出条件,递归到哪一步停止。所以此函数中if(x==0||x==1)就是判断,最终的参数等于0或者等于1为结尾。
而else if(x<0)这个只是判断x是否小于0,毕竟在这个程序中 若X的值小于0,那就没啥意义了。
else {i=x*dg(x-1);}  这里就是递归体了。可以知道 i的值为x的值乘以 (x-1)的递归。 (x-1)的递归返回值 等于 (x-1) * dg((x-1) - 1)。以此类推,可知最终反悔值为i,即i的值为x的阶乘!
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-11-15 16:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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