1.c语言递归算法
利用递归算法求5!。
1.程序分析:递归公式:fn=fn_1*4!
2.程序源代码:
#include "stdio.h"
main()
{
int i;
int fact();
for(i=0;i<5;i++)
printf("\40:%d!=%d\n",i,fact(i));
}
int fact(j)
int j;
{
int sum;
if(j==0)
sum=1;
else
sum=j*fact(j-1);
return sum;
}
2.c语言中的递归
原发布者:zhoujiahaohao2
1.编写计算X的Y次幂的递归函数getpower(intx,int),并在主程序中实现输入输出。#include"stdio.h"longgetpower(intx,inty){if(y==1)returnx;elsereturnx*getpower(x,y-1);}voidmain(){intnum,power;longanswer;printf("pleaseinputanumber:");scanf("%d",&num);printf("pleaseinputthenumber'spowerseries:");scanf("%d",&power);answer=getpower(num,power);printf("结果是:%ld\n",answer);}结果说明:输入61再输入5求得61的5次幂为844596301.2编写计算学生年龄的递归函数。#includeintage(intn){intc;if(n==1)c=10;elsec=age(n-1)+2;returnc;}voidmain(){intn=5;printf("thefivestudent'sageis:%dyearsold\n",age(n));}结果说明:第五个学生的年龄为18岁。3.编写递归函数实现Ackman函数。#includeAcm(intm,intn){if(m==0)returnn+1;elseif(n==0)returnAcm(m-1,1);elsereturnAcm(m-1,Acm(m,n-1));}intmain(){printf("Acm(2,1)=%d\n",Acm(2,1));printf("Acm(3,2)=%d\n",Acm(3,2));return0;}结果说明:利用递归函数求得Acm(2,1)=5,Acm(3,2)=29.实验小结:
3.C语言什么是递归方法
编程里面估计最让人摸不着头脑的基本算法就是递归了。
很多时候我们看明白一个复杂的递归都有点费时间,尤其对模型所描述的问题概念不清的时候,想要自己设计一个递归那么就更是有难度了。今天我也花费了半个小时来搞明白二叉树的平衡性的递归模型,首先我不明白什么叫做平衡性,所以花费的时候大部分实在试探理解平衡性的含义。
在搞明白的时候,我突然想到假如让我来设计,在我知道平衡性的前提下,我是否可以建立如此简洁的递归模型。为此,我遇到的问题是我们到底在什么情况下适用递归模型,并且递归模型如何建立。
数学都不差的我们,第一反应就是递归在数学上的模型是什么。毕竟我们对于问题进行数学建模比起代码建模拿手多了。
(当然如果对于问题很清楚的人也可以直接简历递归模型了,运用数模做中介的是针对对于那些问题还不是很清楚的人) 自己观察递归,我们会发现,递归的数学模型其实就是归纳法,这个在高中的数列里面是最常用的了。回忆一下归纳法。
归纳法适用于想解决一个问题转化为解决他的子问题,而他的子问题又变成子问题的子问题,而且我们发现这些问题其实都是一个模型,也就是说存在相同的逻辑归纳处理项。当然有一个是例外的,也就是递归结束的哪一个处理方法不适用于我们的归纳处理项,当然也不能适用,否则我们就无穷递归了。
这里又引出了一个归纳终结点以及直接求解的表达式。如果运用列表来形容归纳法就是:步进表达式:问题蜕变成子问题的表达式 结束条件:什么时候可以不再是用步进表达式 直接求解表达式:在结束条件下能够直接计算返回值的表达式 逻辑归纳项:适用于一切非适用于结束条件的子问题的处理,当然上面的步进表达式其实就是包含在这里面了。
这样其实就结束了,递归也就出来了。递归算法的一般形式: void func( mode) { if(endCondition) { constExpression //基本项 } else { accumrateExpreesion /归纳项 mode=expression //步进表达式 func(mode) / /调用本身,递归 } }最典型的就是N!算法,这个最具有说服力。
理解了递归的思想以及使用场景,基本就能自己设计了,当然要想和其他算法结合起来使用,还需要不断实践与总结了。例如:返回一个二叉树的深度:int depth(Tree t){ if(!t) return 0; else { int a=depth(t.right); int b=depth(t.left); return (a>b)?(a+1):(b+1); } } 判断一个二叉树是否平衡:int isB(Tree t){ if(!t) return 0; int left=isB(t.left); int right=isB(t.right); if( left >=0 && right >=0 && left - right <= 1 || left -right >=-1) return (left 纯递归问题的难易主要纠结于一些条件表达式的构造以及初值的设置(上面的为直接表达式值的设定)。 最后需要补充的是,很多不理解递归的人,总认为递归完全没必要,用循环就可以实现,其实这是一种很肤浅的理解。 因为递归之所以在程序中能风靡并不是因为他的循环,大家都知道递归分两步,递和归,那么可以知道递归对于空间性能来说,简直就是造孽,这对于追求时空完美的人来说,简直无法接接受,如果递归仅仅是循环,估计现在我们就看不到递归了。递归之所以现在还存在是因为递归可以产生无限循环体,也就是说有可能产生100层也可能10000层for循环。 例如对于一个字符串进行全排列,字符串长度不定,那么如果你用循环来实现,你会发现你根本写不出来,这个时候就要调用递归,而且在递归模型里面还可以使用分支递归,例如for循环与递归嵌套,或者这节枚举几个递归步进表达式,每一个形成一个递归。 用递归法计算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。 这个东西关键是递归算法的确定,需要一点数学知识。 #include //递归计算函数 int calc(int x) { if (x if (x == 1) { return 1; } else if (x == 2) { return 3; } else { return (x+1)*calc(x-1)-x*calc(x-2);//核心数学算法 } } int main(int argc, char* argv[]) { //测试,输出1到10的结果 for (int i=1; i{ printf("==== i = %d ====\n", i); printf("calc = %d\n\n", calc(i)); } return 0; } #include<stdio.h> void main(){ int a,b; printf(“请输入所求阶乘的数a:\n"); scanf("%d",&a); fun(&a); printf("所得a的阶乘为:\n”); int fun(int a){ int a; if(a==0) a=1; esle a=fun(n)*fun(n-1); return a; } } 试一下吧,生疏了 #include <stdio.h> long factorial(long n) { if (n == 0 || n == 1) return 1; else return n * factorial(n-1); } int main(void) { int n = 0, i = 0; long sum = 0; printf("Please input a number: \n"); scanf("%d", &n); printf("%d! = %lu\n", n, factorial(n)); return 0; } 转载请注明出处育才学习网 » c语言递归算法怎么写4.c语言递归算法
5.计算1!+2!+
6.c语言递归排序怎么写、
7.使用递归算法求n