打印N个数的循环算法和递归算法比较

1.循环算法:

1 void PrintN_1(int N)
2 {
3     int i;
4     for (i = 0; i <= N; i++)
5         printf("%d
", i);
6     return;
7 }

N可以为任意数量级的整数

2.递归算法:

1 void PrintN_2(int N)
2 {
3     if (N)
4     {
5         PrintN_2(N - 1);
6         printf("%d
", N);
7     }
8 }

当N为10^4个数量级的时候程序就会非正常中断,要计算PrintN_2(N),因为这个函数里还有其他的语句,所以要先保存它的状态,然后进入下一次递归;而在执行PrintN_2(N -1)时,为了在程序最终返回是能执行它之后的语句,所以要先保存它的状态,然后进入下一次调用,……,直到执行到PrintN_2(0)时,函数才直接返回,然后逐级执行之前保存的状态中的其他语句,执行完之后释放内存。所以这个递归在N非常大时,经过展开后是非常庞大的,需要耗费大量的内存空间,当所需的内存空间超过堆栈的最大内存时,程序就会非正常中断,从而一个数也不打印。

假设存储每个函数的转态占用C个单位的内存空间,那么执行PrintN_2(N)就需要C * N个单位的内存空间,这个算法的空间复杂度就是S(N) = C * N;

原文地址:https://www.cnblogs.com/hi3254014978/p/9706281.html