C 关于递归
经过一道杨辉三角的题,总算差不多知道了关于递归的几个问题。
- 递归里怎么看return
- 为什么说递归效率低,能不用就不用
方便阅读期间,我们直接在这里再次贴出代码:
#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]
由这张图中我们可以看出,递归的重复运算率极高,并没有有效的利用起来,所以效率自然不如其他写法。
植入部分
如果您觉得文章不错,可以通过赞助支持我。
如果您不希望打赏,也可以通过关闭广告屏蔽插件的形式帮助网站运作。