C 关于递归

经过一道杨辉三角的题,总算差不多知道了关于递归的几个问题。

  1. 递归里怎么看return
  2. 为什么说递归效率低,能不用就不用

方便阅读期间,我们直接在这里再次贴出代码:

#include <stdio.h>

int Yang(int row, int col)
{
    int len = row;
    if (row == 1 || col == 1 || col == len)
        return 1;
    if (col > len)
        return 0;
    return Yang(row - 1, col - 1) + Yang(row - 1, col);
}

int main(void)
{
    int row, i;

    scanf("%d", &row);

    for (i = 1; i <= row; ++i)
        printf("%d ", Yang(row, i));
    printf("\n");

    return 0;
}
int Yang(int row, int col)
{
    int len = row;
    if (row == 1 || col == 1 || col == len)
        return 1;
    if (col > len)
        return 0;
    return Yang(row - 1, col - 1) + Yang(row - 1, col);
}

我们可以看看这段,刚开始我以为return的功能是返回给main,然后就纠结了,卧槽怎么不输出呀,好生气啊到底什么情况。
后来才知道,return的功能,详细的来说是返回上层函数(调用它的地方),实际上调用它的是递归之后的Yang(row - 1, col - 1)(或者其他),而不是main中的,所以返回上一层并没有导致输出。只是加上了一个数字罢了:

// 为了方便第二行的计算,假设先补成这样 同理
1 0
1 1
``
最后递归出来答案,最终返回给了main,当然还是不大容易懂的,多看看多写写或许就能明白什么情况了。

接下来讲讲递归的效率问题(这是斐波那契数列的递归写法):
![download.jpg][1]
由这张图中我们可以看出,递归的重复运算率极高,并没有有效的利用起来,所以效率自然不如其他写法。

植入部分

如果您觉得文章不错,可以通过赞助支持我。

如果您不希望打赏,也可以通过关闭广告屏蔽插件的形式帮助网站运作。

标签: 源码, 知识, 代码段

添加新评论