递归算法是一个过程或函数在其定义或说明中又直接或间接调用自身的一种方法,它通常把一个大型而复杂的问题晨晨转化成与原问题相似的,规模较小的问题来解决,一般来说,递归需要边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进,当递归条件满足时,递归返回。在使用递归时必须要有明确的结束条件,称为递归出口,否则递归将无限的进行下去(死锁)
1、菲波那切数列(顺推)
Fibonacci数列是递归数列,它的每一项都等于前两项和,在生物学中,许多生物现象都存在菲波那切数列的规律
//打印输出20以内的Fibonacci数列 #include<stdio.h> int main(){ int fib[20]={1,1}; for(int i = 2; i < 20; i++){ fib[i] = fib[i-1] + fib[i-2]; } for(int i = 0; i < 20; i++){ printf("%d ",fib[i]); } printf(" "); return 0; }
2、递归逆推算法实现
例子:父亲准备一次性凑齐儿子的大学四年学费,然后儿子采用整存领取的方式,每月的月底取出1000元,准备下个月的开支,假设银行的年利息为1.71%,求出父亲最初需要一次性存多少钱,才能保证儿子大学四年的生活开支。
//递归逆推 #include<stdio.h> #define FETCH 1000 #define PATE 0.0171 int main(){ double corpus[49]; corpus[48] = (double)FETCH; for(int i = 47; i > 0; i--){ corpus[i] = (corpus[i+1]+FETCH)/(1+PATE/12); } printf("父亲需要一次性准备:%.2f元 ",corpus[1]); return 0; }
3、递归计算阶乘
1 #include<stdio.h> 2 int fact(int n){ 3 if(n<=1) 4 return 1; 5 else 6 return n*fact(n-1); 7 } 8 int main(){ 9 int n; 10 printf("请输入要计算阶乘的一个整数:"); 11 scanf("%d",&n); 12 printf(" %d的阶乘为:%d",n,fact(n)); 13 return 0; 14 }
4、进制之间的转换(递归算法实现)
1 //实现十进制转任意进制 2 #include<stdio.h> 3 #include<string.h> 4 #include<conio.h> 5 void convto(char *s,int n,int b){//n是十进制数,b是转换成的进制数 6 char bit[] = {"0123456789ABCDEF"}; 7 int len; 8 if(n == 0){ 9 strcpy(s," "); 10 return ; 11 } 12 convto(s,n/b,b); 13 len = strlen(s); 14 s[len] = bit[n%b]; 15 s[len+1] = ''; 16 } 17 int main(){ 18 char s[80]; 19 int i,old,base; 20 printf("请输入十进制数:"); 21 scanf("%d",&old); 22 printf(" 请输入要转换的进制数:"); 23 scanf("%d",&base); 24 convto(s,old,base); 25 printf(" %s ",s); 26 getch(); 27 return 0; 28 }
5、汉诺塔
#include<stdio.h> void move(int n,char x,char y,char z){ if(n==1) printf("%c-->%c ",x,z); else{ move(n-1,x,z,y); printf("%c-->%c ",x,z); move(n-1,y,x,z); } } int main(){ int n; printf("请输入汉诺塔的层数:"); scanf("%d",&n); printf("移动步骤如下: "); move(n,'x','y','z'); return 0; }