C高级之函数(三)

函数的递归调用

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个递归练习题练习,在看我的下一篇博客:汉诺塔问题。


猜你喜欢

转载自blog.csdn.net/weixin_42048417/article/details/80141170