CodeSky 代码之空

随手记录自己的学习过程

C 关于递归

2014-03-14 14:54分类: C评论: 0

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

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

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

1#include <stdio.h>
2
3int Yang(int row, int col)
4{
5    int len = row;
6    if (row == 1 || col == 1 || col == len)
7        return 1;
8    if (col > len)
9        return 0;
10    return Yang(row - 1, col - 1) + Yang(row - 1, col);
11}
12
13int main(void)
14{
15    int row, i;
16
17    scanf("%d", &row);
18
19    for (i = 1; i <= row; ++i)
20        printf("%d ", Yang(row, i));
21    printf("\n");
22
23    return 0;
24}
25
1int Yang(int row, int col)
2{
3    int len = row;
4    if (row == 1 || col == 1 || col == len)
5        return 1;
6    if (col > len)
7        return 0;
8    return Yang(row - 1, col - 1) + Yang(row - 1, col);
9}
10

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

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

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


  [1]: http://zhpech.b0.upaiyun.com/usr/uploads/2014/03/1565065011.jpg

评论 (0)