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),得先


发布评论