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;