「どのように」と「何を」はコインの裏表であり、何らかの方法で考えると役立つ場合があります。「何」をするかを考えることは、特に再帰関数を書いた経験があまりない人にとって、再帰について考える良い方法です。「どのように」は一連のステップを意味し、「何を」は一連の定義を意味します。繰り返しの例を考えてみましょう (私は Scala を知らないので Haskell を使用しますが、概念は直接翻訳可能でなければなりません)。
Haskell の反復関数は と呼ばれますがmap
、自分で書きたいとします。再帰の経験があまりない場合、別の関数 ( ) をリストのすべての要素にmap
適用する関数 ( ) の書き方 ( の「マッピング」) を想像するのは難しいかもしれません。必要な関数の型シグネチャは次のとおりです。f
f
list
map :: (a -> b) -> [a] -> [b]
それでは、リストのすべての要素に適用される関数が「何」であるかを考えてみましょう。これは、最初の要素に適用される関数であり、その後にリストの残りの部分にマップされる関数が続きます。それでは、次のようにコーディングしましょう。
map f (firstElement:restOfList) = (f firstElement):(map f restOfList)
これでほぼ完了です。残っているのは、ベースケースを処理することだけです。リストが空の場合はどうなりますか? 明らかに、空のリストにマップされた関数はすべて空のリストであるため、次のようにコーディングします。
map _ [] = []
これで完了です。「どのように」という観点から考えて上記のコードを書くことができるなら、すぐに進んでください (私はより多くの経験を積んでいるので、より頻繁にそうする傾向があります)。しかし、「何を」という観点から考えることは、行き詰まった場合に役立つテクニックです。