2

一般的に、私が聞きたいのは、

  • 問題が命令型言語と関数型言語の両方の方法で解決できる場合、関数型言語は命令型言語と比較して、少なくともメモリを節約せずにメモリを浪費します。なぜなら、関数言語は再帰に大きく応答し、再帰は多くのメモリをプッシュするからですスタック

  • 上記の質問に従って、メモリ最適化の観点から、ジョブが命令型言語で実行できる場合、関数型言語を使用するべきではありません (少なくともそれよりも悪くないでしょう) ?


上記の質問は、実際にはアルゴリズムの質問から来ています。

追加のスペースを使用せずにスタックを予約します。

void insert_at_bottom(node **stack, int data)
{
     if( isempty(*stack) ){
      push(stack,data);
      return;
     }
     int temp=pop(stack);
     insert_at_bottom(stack,data);
     push(stack,temp);
}  


void rev_stack(node **stack)
{
     if( isempty(*stack) ) return;
     int temp = pop(stack);
     rev_stack(stack);
     insert_at_bottom(stack,temp);
}

上記の質問は、二重再帰を使用することで解決できます。私の意見では、コードで追加メモリを使用していなくても、スタック内の追加スペースを実際に「隠します」。


もちろん、私の質問はより一般的に言えば、上記の特定の質問に集中する必要はありません。

丁寧なアドバイスありがとうございます!

4

2 に答える 2

3

理論的な意味では、いいえ。反復アルゴリズムを再帰アルゴリズムにいつでも変換でき、その逆も可能です。同じアルゴリズムを想定し、末尾呼び出しの最適化を実装すると、メモリ消費量はまったく同じになります。

実用的な意味では、そうかもしれません。関数型プログラミングで不変データ構造を使用するスタイルは、大量のメモリを占有する可能性があります。

IMO、関数型プログラミングと命令型プログラミングの使用はスタイルの問題です。コードに最も適したものを使用してください。また、マシンのパフォーマンスを最後まで引き出す必要がある場合は、手動で最適化されたアセンブリをいつでも作成できます。

于 2014-05-03T22:24:08.720 に答える