
(先来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)递归运行的时候,顺序是怎样的,请就这个题说一下。
其实俺是递归那块没学懂,书上的也没这个,自己看也不懂。。 展开
#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)递归运行的时候,顺序是怎样的,请就这个题说一下。
其实俺是递归那块没学懂,书上的也没这个,自己看也不懂。。 展开
5个回答
展开全部
递归这一块儿,还是建议你看看书,否则一句半句难以解释清楚。我试着解答一下你的问题吧。
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++);
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++);
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
(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,“结果出来了”,每调一次函数要进栈一次,在“结果出来了”之后被调用的函数安照相反的顺序出栈即可。不知道你明白没有?
(2)不懂你的问题是什么意思,递归就是函数的调用(的一种高级用法),和函数调用原理一样,要进栈、出栈,只不过是递归时一个个进栈,然后再一个个出栈。
(3)比如你输入了一个5,那么他是奇数所以要减1,n变为4,递归调用recursive(),4是偶数,应该除2,n=2,递归调用recursive(),2是偶数,应该除2,n=1,递归调用recursive(),1奇数所以要减1,n变为0,“结果出来了”,每调一次函数要进栈一次,在“结果出来了”之后被调用的函数安照相反的顺序出栈即可。不知道你明白没有?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
第一个问题解决方法就是把t的定义放到函数体外面去 而你的那个输出语句也不能放在判断条件的函数体里面 否则就没有结果的显示了 第二个问题 递归的中间参数存放在系统专门的堆栈区里 第三个问题 递归的运行顺序就是不断调用本身调用到递归条件不成立 也就是递归的最后一层 求出结果 然后再逆序逐层代入结果 最后解回第一层
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
int t=1; /*第一个问题*/
因为t是个局部变量,其生命周期就是这个函数内,所以每次调用此函数,t都被重新赋值为一,只要将其声明为静态变量(static int t = 1;),静态变量的声明周期是这个文件。
递归就是重复的调用自己,把参数改变一下,当达到某个条件就停止。最经典的应该是斐波那契数列的递归求解(简单,好理解)
因为t是个局部变量,其生命周期就是这个函数内,所以每次调用此函数,t都被重新赋值为一,只要将其声明为静态变量(static int t = 1;),静态变量的声明周期是这个文件。
递归就是重复的调用自己,把参数改变一下,当达到某个条件就停止。最经典的应该是斐波那契数列的递归求解(简单,好理解)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询