2024年6月2日发(作者:)

前言

说白了递归就象我们讲的那个故事:山上有座庙,庙里有个老和

尚,老和尚在讲故事,它讲的故事是:山上有座庙,庙里有个老和尚,

老和尚在讲故事,它讲的故事是:……也就是直接或间接地调用了其自

身。

就象上面的故事那样,故事中包含了故事本身。因为对自身进行调

用,所以需对程序段进行包装,也就出现了函数。

函数的利用是对数学上函数定义的推广,函数的正确运用有利于简

化程序,也能使某些问题得到迅速实现。对于代码中功能性较强的、重

复执行的或经常要用到的部分,将其功能加以集成,通过一个名称和相

应的参数来完成,这就是函数或子程序,使用时只需对其名字进行简单

调用就能来完成特定功能。

例如我们把上面的讲故事的过程包装成一个函数,就会得到:

void Story()

{

puts("从前有座山,山里有座庙,庙里有个老和尚,老和尚在讲故

事,它讲的故事是:");

getchar();//按任意键听下一个故事的内容

Story(); //老和尚讲的故事,实际上就是上面那个故事

}

函数的功能是输出这个故事的内容,等用户按任意键后,重复的输

出这段内容。我们发现由于每个故事都是相同的,所以出现导致死循环

的迂回逻辑,故事将不停的讲下去。出现死循环的程序是一个不健全的

程序,我们希望程序在满足某种条件以后能够停下来,正如我们听了几

遍相同的故事后会大叫:“够了!”。于是我们可以得到下面的程序:

#include

const int MAX = 3;

void Story(int n);//讲故事

int main(void)

{

Story(0);

getchar();

return 0;

}

void Story(int n)

{

if (n < MAX)

{

puts("从前有座山,山里有座庙,庙里有个老和尚,老和尚对

小和尚说了一个故事:");

getchar();

Story(n+1);

}

else

{

printf("都讲%d遍了!你烦不烦哪?n", n);

return ;

}

}

上面的Story函数设计了一个参数n,用来表示函数被重复的次

数,当重复次数达到人们忍受的极限(MAX次)时,便停下来。

基本递归

数学归纳法表明,如果我们知道某个论点对最小的情形成立,并且

可以证明一个情形暗示着另一个情形,那么我们就知道该论点对所有情

形都成立。

数学有时是按递归方式定义的。

例1:假设S(n)是前n个整数的和,那么S(1)= 1,并且我们可以

将S(n)写成S(n)= S(n-1)+ n。

根据递归公式,我们可以得到对应的递归函数:

int S(int n) //求前n个整数的和

{

if (n == 1)

return 1;

else

return S(n-1) + n;

}

函数由递归公式得到,应该是好理解的,要想求出S(n),得先