1
データが類似していると見なすことができる場合、問題に対する再帰的な解決策は非常に小さくなります。例えば。sum-tree
バイナリ ツリーがあり、定義したすべてのリーフ ノードの合計を取得する場合は、それがリーフ ノードの場合は合計、値はリーフ ノードでない場合は、両方のサブツリーの合計の加算です。 .
これが私のテキストのScheme実装です
(define (sum-tree tree)
(if (leaf? tree)
(node-value tree)
(+ (sum-tree (node-left tree))
(sum-tree (node-right tree)))))
またはJavaでも同じで、Nodeクラスのメソッドとして定義されています。
public int sum()
{
if ( isLeaf() )
return value;
else
return left.sum() + right.sum();
}
これに対する反復的な解決策は、長くなり、読みにくくなります。この場合、再帰を優先する必要があります。
2
場合によります。Python や Java でプログラミングしている場合は、末尾再帰がないため、そうすべきではありません。ただし、Scheme では、それが唯一の方法です。あなたの言語が末尾再帰をサポートしている場合、より明確なコードを作成するときに再帰を選択する必要があります。
3
行うことによって学びます。ツールとして再帰を使用するいくつかのアルゴリズムを作成する必要があります。流れがわからない場合は、紙を使用してスタックの流れをたどります。いくつかのSchemeまたは同様の関数型言語を学ぶことは、あなたを大いに助けるかもしれません.