以前学VB的时候看过关于递归算法的一些教程,但是那个时候愣是看不懂,今天重看了C的写法,大概懂了,写下来,但是记忆加深。
递归算法必须满足以下三个条件才可以成立。
1.具有规律性(基本上可以用for解决的),所求问题可以用同个法子解决。例如:
有5个数,a1,a2,a3,a4,a5,其中a5=a4+2,a4=a3+2,a3=a2+2,a2=a1+2。。。如果转换成公式的话则为aN=a(N-1)+2。
2.子问题的规模比原问题的小,规模应该是具有规律性的递减。
3.必须有递归结束的条件。
简单的例子,有5个数,a1,a2,a3,a4,a5,其中a5=a4+2,a4=a3+2,a3=a2+2,a2=a1+2,a1=10,求a5的值?
c语言(其他语言基本可以参考着实现)
#include <stdio.h>
void main()
{
int add(
int n); /*声明函数*/
printf("%d \n",add(5));/* 打印结果 */
}
int add(int n)
{
if(n==1) return 10; /* 如果n是1话,那么返回结果10 */
else
return
add(n-1)+2; /* 否则,返回 (n-1)+2 */
}
递归比较难以理解的地方在于函数自我调用的过程,但是如果用一个图来解释的话,那是比较容易看懂,一共分为2个部分,第一部分是回朔,就是找到源头,如果把本例的add(int n)函数进行图解的话:
函数首先会判断N的值,如果不是1,就自我调用,而每次调用的时候,N的值都会递减下去,一直到N=1,如果没有N=1的情况,那么程序会报错。一旦N=1,函数就终止自我调用,返回一个具体的值,而这个具体的值再逐个代入到上一级的调用当中,最后计算出结果。如果用循环语句也可以实现,其实个人认为大部分的时候递归可以完成的事情用循环语句都是可以解决的。所以如果会用循环的话,不用一直苛求一定要使用递归的算法,只要能解决问题就好。
附上本例的循环循环语句解法:
#include <stdio.h>
void main()
{
int a=10;/*已知a1=10,从a2开始计算到a5,每次a等于上一个值+2*/
for(int i=2;i<=5;i++)
{
a+=2;
printf("%d",a);
}