ホームページ > 記事 > ウェブフロントエンド > 末尾呼び出しの最適化を行わずに関数型プログラミングで While ループを置き換える方法は?
末尾呼び出しの最適化を行わずに While ループを関数型プログラミングの代替案に置き換える方法
関数型プログラミングでは、while ループは再帰または再帰に置き換えられることがよくあります。ユーティリティ関数。ただし、再帰呼び出しのオーバーヘッドを削減する末尾呼び出しの最適化がなければ、while ループの機能的な代替手段を見つけるのは困難になる可能性があります。
1 つのアプローチは、「while」ユーティリティ関数を作成することです。ただし、これによりコードがより複雑になる可能性があります。もう 1 つのオプションは、ジェネレーター関数を使用し、ユーティリティ関数を使用してそれらを反復処理することです。ただし、これを実行するための読みやすい方法を見つけるのは難しい場合があります。
最終的に、最適な戦略は特定のシナリオによって異なります。ループが再帰関数として表現できる場合は、再帰が適切なオプションになる可能性があります。そうでない場合は、while ループを使用する方が簡単かもしれません。
JavaScript の例
現在末尾呼び出しの最適化が欠けている JavaScript では、次のスニペットは、 「while」ユーティリティ関数は次のように実装できます。
<code class="javascript">const repeat = n => f => x => n === 0 ? x : repeat (n - 1) (f) (f(x)) console.log(repeat(1e3) (x => x + 1) (0)) // 1000 console.log(repeat(1e5) (x => x + 1) (0)) // Error: Uncaught RangeError: Maximum call stack size exceeded</code>
この例では、repeat 関数は整数 n、関数 f、および初期値 x を受け取ります。 n がゼロになるまで f を x に繰り返し適用します。末尾呼び出しの最適化を行わないと、大きな n を指定してこの関数を実行すると、スタック オーバーフロー エラーが発生します。
以上が末尾呼び出しの最適化を行わずに関数型プログラミングで While ループを置き換える方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。