(先来30,好了【追加】,谢谢)求解c语言递归问题,有耐心的进。。。。

这是我写的一个简单的程序,想看看递归原理,失败。。。。。#include<stdio.h>voidrecursive(intn);voidmain(){inta;scan... 这是我写的一个简单的程序,想看看递归原理,失败。。。。。
#include<stdio.h>
void recursive(int n) ;
void main()
{
int a;
scanf("%d",&a);
printf("\n\n\n");
recursive(a);
return ;
}
void recursive(int n)
{
int t=1; /*第一个问题*/
if(n==0)
{
printf("结果出来了%d\n",t++);
}
else if(n%2==0)
{
recursive(n/2);
printf("除以2 %d\n",t++);
}
else if(n%2)
{
recursive(n-1);
printf("减去1 %d\n",t++);
}
}
有几个问题:
(1) 就是在标注的地方定义了t的值,程序好像是每递归一次就从头开始,所以后面的t++都为一
但是,我把那个定义改为printf("工作原理");结果就只在刚开始的时候出现“工作原理”,后面都没有了,求解.
(2) 就是递归到最后的时候,是系统将递归中参数存起来了吗?
(3)递归运行的时候,顺序是怎样的,请就这个题说一下。
其实俺是递归那块没学懂,书上的也没这个,自己看也不懂。。
展开
 我来答
kirayamato201
2010-07-28 · TA获得超过365个赞
知道小有建树答主
回答量:251
采纳率:0%
帮助的人:275万
展开全部

因为t是recursive的一个变量 每次进入recursive 这个函数就会重新初始化t,上一次调用的recursive中的t已经被销毁(函数结束之后就会销毁)

可以使用静态变量来使t在调用recursive时不用销毁,或者单参数 传入函数中

递归调用就是不断压栈,数据时后进先出 。

上面的运行过程是

10/2=5

5-1=4

4/2=2

2/2=1

1/2=1

1-1=0

这样从下到上逆序返回 事实上 你这里没有返回值  不过你也没什么好返回的

就得出下面结果

义昀欣ek
2010-07-28 · TA获得超过3298个赞
知道小有建树答主
回答量:6776
采纳率:0%
帮助的人:2202万
展开全部
递归这一块儿,还是建议你看看书,否则一句半句难以解释清楚。我试着解答一下你的问题吧。

1.所谓递归,就是函数自己调用自己。这里就是每次调用recursive函数。每一次调用,t都会重新定义,值为1,每一次打印出的t=1都是每次调用recursive函数时新定义的。如果你改为printf("工作原理")的话,每一次函数调用都会打印一次“工作原理”的。后面不会没有,每一次调用函数都会打印的。

2.是的。系统将递归中的参数保存了起来。递归容易大量消耗系统资源,这是其中的原因。

3.假如a=3,执行recursive(3)。
进入recursive函数后,因为3%2不等于0,于是执行recursive(n-1)也就是recursive(2),注意,此时printf("减去1 %d\n",t++)没有执行,因为现在进入了函数recursive(2)。

接下来,recursive(2)中,因为2%2=0,所以,调用函数recursive(n/2);也就是recursive(0)。

接下来,recursive(0)中,因为n等于0,所以 打印("结果出来了%d\n",t++)。

然后程序回到并执行printf("除以2 %d\n",t++);

最后回到并执行printf("减去1 %d\n",t++);
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
hechaomk
2010-07-28 · TA获得超过183个赞
知道答主
回答量:47
采纳率:0%
帮助的人:45.6万
展开全部
(1)我试过了,把那个定义改为printf("工作原理");结果也一大堆"工作原理"。你是不是输入的n有问题啊,比如你输入了0,1,2之类的比较小的
(2)不懂你的问题是什么意思,递归就是函数的调用(的一种高级用法),和函数调用原理一样,要进栈、出栈,只不过是递归时一个个进栈,然后再一个个出栈。
(3)比如你输入了一个5,那么他是奇数所以要减1,n变为4,递归调用recursive(),4是偶数,应该除2,n=2,递归调用recursive(),2是偶数,应该除2,n=1,递归调用recursive(),1奇数所以要减1,n变为0,“结果出来了”,每调一次函数要进栈一次,在“结果出来了”之后被调用的函数安照相反的顺序出栈即可。不知道你明白没有?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
shadow涂
2010-07-28 · TA获得超过113个赞
知道答主
回答量:161
采纳率:0%
帮助的人:55.2万
展开全部
第一个问题解决方法就是把t的定义放到函数体外面去 而你的那个输出语句也不能放在判断条件的函数体里面 否则就没有结果的显示了 第二个问题 递归的中间参数存放在系统专门的堆栈区里 第三个问题 递归的运行顺序就是不断调用本身调用到递归条件不成立 也就是递归的最后一层 求出结果 然后再逆序逐层代入结果 最后解回第一层
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
jun871216
2010-07-28 · TA获得超过347个赞
知道小有建树答主
回答量:224
采纳率:0%
帮助的人:0
展开全部
int t=1; /*第一个问题*/
因为t是个局部变量,其生命周期就是这个函数内,所以每次调用此函数,t都被重新赋值为一,只要将其声明为静态变量(static int t = 1;),静态变量的声明周期是这个文件。
递归就是重复的调用自己,把参数改变一下,当达到某个条件就停止。最经典的应该是斐波那契数列的递归求解(简单,好理解)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式