c语言递归法
Ⅰ c语言 递归算法
||float fac(int n) //递归函数
{
float f; //设一返回变量
if(n<0) printf("n<0,error!"); //如初始输入小于0,显示错误,否则此句不会运行。
else if(n==0||n==1) //当阶乘递减到1或0时,每次递归该返回结果了。
f=1; //这是本身调用真正返回的第一个值。
else f=fac(n-1)*n; //循环递归调用
return(f); //返回值。
}
Ⅱ C语言递归算法
#include<stdio.h>
int calc(int n){
if (n==1) {
return 1;
}else if(n==2){
return 2;
}else{
return n*calc(n-1)-(n-1)*calc(n-2);
}
}
void main(){
int sum=0,i;
for (i = 1; i <= 10; i++) {
sum+=calc(i);
}
printf("sum=%d\n",sum);
}
Ⅲ C语言怎么用递归法求阶乘
1、首先打开vc6.0,新建一个vc项目。
Ⅳ C语言递归函数
#include<stdio.h>
voidfunc(intm,intn)
{
if(m)
{
if(n)
{
func(m,n-1);
printf("%d",m);
}
else
{
func(m-1,m-1);
if(m>1)
{
printf(" ");
}
}
}
}
intmain(void)
{
func(5,5);
return0;
}
Ⅳ C语言中的递归是什么意思
程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。
递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。
一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
(5)c语言递归法扩展阅读:
递归的应用
1、数据的定义是按递归定义的。(Fibonacci函数)
2、问题解法按递归算法实现。这类问题虽则本身没有明显的递归结构,但用递归求解比迭代求解更简单,如Hanoi问题。
3、数据的结构形式是按递归定义的。
递归的缺点
递归算法解题相对常用的算法如普通循环等,运行效率较低。因此,应该尽量避免使用递归,除非没有更好的算法或者某种特定情况,递归更为适合的时候。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。
Ⅵ c语言中递归函数
调用过程就是自己调用自己,直到满足退出条件,这个很重要
比如要求5的阶乘,先要求4的阶乘,接着求3的阶乘,。。。最后当n=1时,直接return 1
也就结束了递归。其实很好理解的。。
Ⅶ c语言递归算法
#include <stdio.h>
void func(int n)
{
int i;
if(n == 1)
printf("%d ",n);
else
{
func(n-1);
printf(" ");
for(i = 1; i <= n;i++)
printf("%d ",i);
}
}
int main(void)
{
int n;
scanf("%d",&n);
func(n);
}
Ⅷ C语言(递归)
用递归法计算n!
用递归法计算n!可用下述公式表示:
n!=1 (n=0,1)
n×(n-1)! (n>1)
按公式可编程如下:
long ff(int n)
{
long f;
if(n<0) printf("n<0,input error");
else if(n==0||n==1) f=1;
else f=ff(n-1)*n;
return(f);
}
main()
{
int n;
long y;
printf("\ninput a inteager number:\n");
scanf("%d",&n);
y=ff(n);
printf("%d!=%ld",n,y);
}
程序中给出的函数ff是一个递归函数。主函数调用ff 后即进入函数ff执行,如果n<0,n==0或n=1时都将结束函数的执行,否则就递归调用ff函数自身。由于每次递归调用的实参为n-1,即把n-1的值赋予形参n,最后当n-1的值为1时再作递归调用,形参n的值也为1,将使递归终止。然后可逐层退回。
下面我们再举例说明该过程。设执行本程序时输入为5,即求5!。在主函数中的调用语句即为y=ff(5),进入ff函数后,由于n=5,不等于0或1,故应执行f=ff(n-1)*n,即f=ff(5-1)*5。该语句对ff作递归调用即ff(4)。
进行四次递归调用后,ff函数形参取得的值变为1,故不再继续递归调用而开始逐层返回主调函数。ff(1)的函数返回值为1,ff(2)的返回值为1*2=2,ff(3)的返回值为2*3=6,ff(4)的返回值为6*4=24,最后返回值ff(5)为24*5=120。
谭浩强书中的例子。
Ⅸ C语言什么是递归方法
编程里面估计最让人摸不着头脑的基本算法就是递归了。很多时候我们看明白一个复杂的递归都有点费时间,尤其对模型所描述的问题概念不清的时候,想要自己设计一个递归那么就更是有难度了。今天我也花费了半个小时来搞明白二叉树的平衡性的递归模型,首先我不明白什么叫做平衡性,所以花费的时候大部分实在试探理解平衡性的含义。在搞明白的时候,我突然想到假如让我来设计,在我知道平衡性的前提下,我是否可以建立如此简洁的递归模型。为此,我遇到的问题是我们到底在什么情况下适用递归模型,并且递归模型如何建立。
数学都不差的我们,第一反应就是递归在数学上的模型是什么。毕竟我们对于问题进行数学建模比起代码建模拿手多了。 (当然如果对于问题很清楚的人也可以直接简历递归模型了,运用数模做中介的是针对对于那些问题还不是很清楚的人)
自己观察递归,我们会发现,递归的数学模型其实就是归纳法,这个在高中的数列里面是最常用的了。回忆一下归纳法。
归纳法适用于想解决一个问题转化为解决他的子问题,而他的子问题又变成子问题的子问题,而且我们发现这些问题其实都是一个模型,也就是说存在相同的逻辑归纳处理项。当然有一个是例外的,也就是递归结束的哪一个处理方法不适用于我们的归纳处理项,当然也不能适用,否则我们就无穷递归了。这里又引出了一个归纳终结点以及直接求解的表达式。如果运用列表来形容归纳法就是:
步进表达式:问题蜕变成子问题的表达式
结束条件:什么时候可以不再是用步进表达式
直接求解表达式:在结束条件下能够直接计算返回值的表达式
逻辑归纳项:适用于一切非适用于结束条件的子问题的处理,当然上面的步进表达式其实就是包含在这里面了。
这样其实就结束了,递归也就出来了。
递归算法的一般形式:
voidfunc(mode)
{
if(endCondition)
{
constExpression//基本项
}
else
{
accumrateExpreesion/归纳项
mode=expression//步进表达式
func(mode)//调用本身,递归
}
}
最典型的就是N!算法,这个最具有说服力。理解了递归的思想以及使用场景,基本就能自己设计了,当然要想和其他算法结合起来使用,还需要不断实践与总结了。
例如:返回一个二叉树的深度:
intdepth(Treet){
if(!t)return0;
else{
inta=depth(t.right);
intb=depth(t.left);
return(a>b)?(a+1):(b+1);
}
}
判断一个二叉树是否平衡:
intisB(Treet){
if(!t)return0;
intleft=isB(t.left);
intright=isB(t.right);
if(left>=0&&right>=0&&left-right<=1||left-right>=-1)
return(left<right)?(right+1):(left+1);
elsereturn-1;
}
上面这两个递归的难易程度就不一样了,第一个关于深度的递归估计只要了解递归思想的都可以短时间设计出来,但第二个估计就要长点时间了。纯递归问题的难易主要纠结于一些条件表达式的构造以及初值的设置(上面的为直接表达式值的设定)。
最后需要补充的是,很多不理解递归的人,总认为递归完全没必要,用循环就可以实现,其实这是一种很肤浅的理解。因为递归之所以在程序中能风靡并不是因为他的循环,大家都知道递归分两步,递和归,那么可以知道递归对于空间性能来说,简直就是造孽,这对于追求时空完美的人来说,简直无法接接受,如果递归仅仅是循环,估计现在我们就看不到递归了。递归之所以现在还存在是因为递归可以产生无限循环体,也就是说有可能产生100层也可能10000层for循环。例如对于一个字符串进行全排列,字符串长度不定,那么如果你用循环来实现,你会发现你根本写不出来,这个时候就要调用递归,而且在递归模型里面还可以使用分支递归,例如for循环与递归嵌套,或者这节枚举几个递归步进表达式,每一个形成一个递归。
Ⅹ C语言递归算法
递归调用是先返回最内层的函数,执行最内层调用语句的后面的代码后返回当前层次的函数调用。要立体的看递归,不能直线思维。
age(3);//这一句执行的过程:
x==3,因为x!=0,所以进入if语句块中,执行age(x-1);//等age(x-1);返回后还要执行下一行代码printf("%d ",x);
也就是再次调用age这个函数,这次是x==3时的age函数中调用x==2时的age函数,此时传入的参数是2,进入age函数内执行过程如下:
x==2,因为x!=0,所以进入if语句块中,再次执行age(x-1);同上,此时传入的参数是1,
x==1,因为x!=0,所以进入if语句块中,再次执行age(x-1);同上,此时传入的参数是0,
x==0,所以不进入if内部了,直接结束了这次的age函数,开始执行age(x-1);函数的下一行
printf("%d ",x);此时的x==1,所以输出1.然后此次的age(x-1);函数调用结束,继续执行此次
age(x-1);函数的下一行printf("%d ",x);此时x==2,所以输出是2,同理还要输出一次3.输出3的时候就是最开始调用age(3)的这次。