TL; DR:関数型言語は、非関数型言語よりも再帰をうまく処理しますか?
現在、コードコンプリート2を読んでいます。本のある時点で、著者は再帰について警告しています。彼は、可能な場合は避けるべきであり、再帰を使用する関数は一般にループを使用するソリューションよりも効果が低いと言います。例として、著者は再帰を使用してJava関数を記述し、そのように数値の階乗を計算しました(現時点では本が手元にないため、まったく同じではない場合があります)。
public int factorial(int x) {
if (x <= 0)
return 1;
else
return x * factorial(x - 1);
}
これは悪い解決策として提示されます。ただし、関数型言語では、多くの場合、再帰を使用することが推奨される方法です。たとえば、再帰を使用したHaskellの階乗関数は次のとおりです。
factorial :: Integer -> Integer
factorial 0 = 1
factorial n = n * factorial (n - 1)
そして、良い解決策として広く受け入れられています。私が見たように、Haskellは再帰を非常に頻繁に使用しますが、眉をひそめているものはどこにも見ませんでした。
私の質問は基本的には次のとおりです。
- 関数型言語は非関数型言語より再帰をうまく処理しますか?
編集:私が使用した例は私の質問を説明するのに最適ではないことを認識しています。Haskell(および関数型言語全般)は、非関数型言語よりも再帰を頻繁に使用することを指摘したかっただけです。
factorial n = product [1..n]
より簡潔で、より効率的で、大規模にスタックをオーバーフローさせませんn
(メモ化が必要な場合は、まったく異なるオプションが必要です)。product
いくつかの観点で定義さfold
れた、され再帰的に定義されていますが、細心の注意を払って。再帰はほとんどの場合許容できる解決策ですが、間違った/次善の方法を実行するのは依然として簡単です。