2

私は新しい Haskell であり、まだいくつかの基本を理解しようとしています。再帰関数を書くとき、意識的にどちらかを選択することなく、自然に再帰的または末尾再帰的な方法でそれらを記述します。

私の質問は:

  1. 再帰関数が与えられた場合、それを末尾再帰に変換する簡単な方法はありますか?

  2. 末尾再帰関数が与えられた場合、それを再帰関数に変換する簡単な方法はありますか?

例の関数

addOne [] = []
addOne (x:xs) = (x+1):addOne xs

また、関数を書くとき、末尾再帰が別の方法よりも適切かどうかを判断する簡単な方法は何ですか?

4

2 に答える 2

2

Haskellも初めてです。私が読んだ限りでは、Haskell コミュニティでは明示的な再帰は嫌われています。むしろ、Haskell は、一般的な再帰操作をカプセル化する 、 、 、mapなどfilterfoldl標準関数を使用することをプログラマーに奨励しています。foldr例えば、

addOne [] = []
addOne (x:xs) = (x+1):addOne xs

次のように書くことができます

addOne xs = map (+1) xs

または、ポイントフリースタイルを使用してさらに一歩進んで、

addOne = map (+1)

これらの標準関数が簡単に適合せず、独自の再帰関数を作成しなければならない状況が発生する可能性があります。しかし、明示的な再帰を実装したくなるようなケースの 90% はカバーされていると思います。

これがあなたの質問に正確に答えているわけではないことは承知していますが、考慮すべきアイデアが得られることを願っています。

于 2013-02-24T20:52:31.197 に答える
1

再帰関数がある場合、それを末尾再帰に変換する簡単な方法はありますか?

いいえ。

末尾再帰関数が与えられた場合、それを再帰に変換する簡単な方法はありますか?

はい。@Joachim Breitnerがすでに言ったように、何もしないでください。しかし、あなたの定義はrecursive一般的なものから逸脱しているように思われるので、多分あなたはあなたが何を意味するのか教えてください。

于 2013-02-24T21:47:31.010 に答える