所谓递归,简而言之就是应用程序自身调用自身,以实现层次数据结构的查询和访问。 递归的使用可以使代码更简洁清晰,可读性更好(对于初学者到不见得),但由于递归需要系统堆栈,所以空间消耗要比非递归代码要大很多,而且,如果递归深度太大,可能系统资源会不够用。
递归分为直接递归和间接递归:简而言之,在函数中直接调用函数本身,称为直接递归调用。在函数中调用其它函数,其它函数又调用原函数,这就构成了函数自身的间接调用称为间接递归调用。
利用递归算法解题,首先要对问题的以下三个方面进行分析: 一、决定问题规模的参数。需要用递归算法解决的问题,其规模通常都是比较大的,在问题中决定规模大小(或问题复杂程度)的量有哪些?把它们找出来。二、问题的边界条件及边界值。在什么情况下可以直接得出问题的解?这就是问题的边界条件及边界值。三、解决问题的通式。把规模大的、较难解决的问题变成规模较小、易解决的同一问题,需要通过哪些步骤或等式来实现?这是解决递归问题的难点。
简单地说,函数下一次的参数是函数自身上一次的输出值,也就是说,函数的下一次执行取决于上一次的结果,即自身依赖。如求阶乘算法:
1 #include <stdio.h> 2 3 float fun(float n) 4 { 5 if (n<0) 6 { 7 exit(-1); 8 } 9 else if (n==0||n==1) //退出条件 10 { 11 return 1; 12 } 13 else 14 return n*fun(n-1); //递归调用 15 16 } 17 18 19 void main(void) 20 { 21 int n; 22 printf("请输入数(n!): "); 23 scanf("%d",&n); 24 printf("%.f",fun(n)); //不显示小数部分的输出 25 return; 26 }
我们从递归函数fun中,可以得到:1)必须有退出条件(if);2)每次调用参数不同,但有一定的规律民(n-1);3)自身的输出作为自身的输入return。
1 #include <stdio.h> 2 #include <string.h> 3 void fun(char *s, int n, int b) 4 { 5 char bit[]={"0123456789ABCDEF"}; 6 int len; 7 if(n==0) 8 { 9 strcpy(s,""); 10 return; 11 } 12 fun(s, n/b, b); 13 len = strlen(s); 14 s[len] = bit[n%b]; 15 s[len+1] = '