递归其实就是自己调用自己的编程,递归作为一种算法在我们开发中经常用到,一般就是把大问题转化为与自己相似的小问题,可以少些很多代码,递归就是用有限的语句来定义对象的无线集合,但不能无线地调用本身,必须有个出口,化简位非递归状态问题解决,那么递归一般用于解决哪些问题呢?
- 数据的定义是按 递归定义的,如Fibonacci
- 问题解决按递归算法实现(这类问题虽然本省没有明显的递归结构,但用递归求解比迭代求解更简单,如Hanoi,中国剩余定理也很类似)
- 数据的结构形式是按递归定义的(如二叉树,广义表)
那递归有什么缺点呢?
递归比常用的算法如for loop, while loop, do-while loop循环运行效率低,所有尽可能少用递归
废话不多说开始举例子:
比如现在要求一个数的阶乘, 如 6!
那现在要想求6的阶乘,我们可以变成求6乘5的阶乘, 5的阶乘等于5乘4的阶乘....依此类推,
过程: 6! = 6*5! 5!=5*4!4!= 4*3!3! =3*2! 2!=2*1
So then 6!=6*5*4*3*2*1
下面看看代码怎么实现,我们这里用C语言:
#include<stdio.h>
int fact(int n);
int main(){
int i;
printf("Please print a factor number which you want to solve. ");
scanf("%d",&i);
printf("%d's factor solution is %d\n, i, fact(i)");
getch();
return 0;
}
int fact(int n){
if(n<=1)
return 1;
else
return n*fact(n-1); //此处函数又调用自己,这就是递归
}
我们再来看一个递归算法的实例:数制转换
(121)10=(1111001)2
下面用C语言实现:
#include<stdio.h>
#include<string.h>
void bytedance(char *s,int n,int b){
char bit[]={"0123456789ABCDEF"};
int len;
if(n==0){
strcpy(s,"");
return;
}
bytedance(s,n/b,b);
len=strlen(s);
s[len]=bit[n%b];
s[len+1]='\0';
}
void main(void){
char s[80];
int i, base, old;
printf("please input decimal number:");
scanf("%d",&old);
printf("please input transfer scale:");
scanf("%d",&base);
bytedance(s,old,base);
printf("%s\n",s);
getch();
return;
}