スペースの複雑さが最も低い再帰プログラムと非再帰プログラムのスペースの複雑さの違い (多かれ少なかれ) を知りたいです。また、再帰でのスタックの使用に関する優れたチュートリアルのガイダンスも歓迎します。可能であれば、説明のために短い例も提供してください。
質問する
1305 次
2 に答える
2
再帰はスペースの複雑さを増加させる可能性がありますが、減少することはありません。たとえば、二分探索木への挿入を考えてみましょう。非再帰的な実装 (while サイクルを使用) は O(1) メモリを使用します。再帰的な実装では、O(h) メモリが使用されます (h はツリーの深さです)。
より正式な方法: 空間複雑度 O(X) の再帰アルゴリズムがある場合、空間複雑度 O(X) の非再帰アルゴリズムが常に存在します (スタックを使用して再帰をシミュレートできます)。しかし、その逆ではありません (上記の例を参照)。
于 2013-09-02T18:55:03.727 に答える
1
実装言語がTCOをサポートしている場合、末尾再帰を使用してループ反復とまったく同じスペースの複雑さを実現できます。
int acc=1;
(for int i=1; i<=n; i++) {
acc*=i;
}
return acc;
以下と同じです:
int fact (int i, int acc) {
if( i == 1)
return acc;
return fact(i--, i*acc);
}
return fact(n);
于 2013-09-02T19:48:01.667 に答える