1.循环算法:
1 void PrintN_1(int N)
2 {
3 int i;
4 for (i = 0; i <= N; i++)
5 printf("%d\n", 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", 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;