函数的递归调用
1. 示例:
有5个学生,问第5个学生多大,他说比第4个学生大2岁。问第4个学生多大,他说比第3个学生大2岁。问第3个学生多大,他说比第2个学生大2岁。问第2个学生多大,他说比第1个学生大2岁。问第1个学生多大,他说他10岁。求第5个学生的年龄。
如果让你编程解决这个问题,你如何解决呢?
法1:你也许这样编写:
N5 = 10;
N4 = N5 + 2 = 12;
N3 = N4 + 2 = 14;
N2 = N3 + 2 = 16;
N1 = N2 + 2 = 18;
法2:你也许这样编写:
int fun5(void)
{
return 10;
}
int fun4(void)
{
return fun5() + 2;
}
int fun3(void)
{
return fun4() + 2;
}
int fun2(void)
{
return fun3() + 2;
}
int fun1(void)
{
return fun2() + 2;
}
法2比法1麻烦一些,这个问题我们先暂时不谈。我们先看看法2,fun1、fun2、fun2、fun4的逻辑都是一样的,都是返回一个函数 + 2 的值,fun5是直接返回一个数。既然他们的逻辑结构都是一样的,那是否可以用另一种方式改写这几个函数呢?答案就是这篇博客要讲的函数的递归调用。
2. 函数的递归调用
函数的递归调用就是函数自己调用自己,它的本质当然还是函数调用。在写递归函数时需要注意:
1. 递归出口
2. 递归逻辑
在上个问题中:fun1 -> fun2 -> fun2 -> fun4->fun5,在fun5中不要在调用其他的函数而是直接返回一个具体的数值,这就是递归出口。fun1 -> fun2 -> fun2 -> fun4,在每个函数中都需要取回下一个函数 + 2 的值,这就是递归逻辑。
3. 函数的递归调用基本方程式:
int fun(int n, ……)
{
If(n == 最初的值)
{
return value1;
}
else
{
return fun(n - 1) 运算符 value2;
}
}
根据这个基本方程式,上一个问题用递归函数来写如下:
int age(int n)
{
if(n==1)//递归出口
return10;
else
returnage(n-1)+2;//递归逻辑
}
当n较大时是不是比法1和法2都要简便很多,如果n为一个不确定数,是不是更加需要用递归函数。
练习:用递归法求n!,n = 100。
注:请你在找至少5个递归练习题练习,在看我的下一篇博客:汉诺塔问题。