再帰は単純な観察に基づいており、式による数学的証明ではなく、なぜそれが真であるかについて組み合わせ論的議論を行います。
k
から要素を選択する場合は常にn
、次の 2 つのケースがあります。
- 要素を選択します
#n
- 要素を選ばない
#n
#n
これらのイベントは相互に排他的であるため、組み合わせの合計数は、 を選択した場合の組み合わせの数と、選択しなかった場合の組み合わせの数によって与えられます#n
。
エレメントの選択#n
すでに 1 つの要素を選択しているので、別の要素を選択するだけで済みますk-1
。また、含まれるか含まれないかについては、すでに 1 つの要素が決まっているので、残りのn-1
要素のみを考慮する必要があります。
したがって、要素を選択するための組み合わせの量は#n
、
subset(n - 1, k - 1)
要素を選ばない#n
選択する要素はまだありk
ますが、 element については既に決めているので、選択する要素#n
だけが残りn - 1
ます。したがって:
subset(n - 1, k)
ベースケース
n
再帰は、通常、要素が解の一部である解とそうでない解の 2 つの状況を区別できるという事実を使用します。
ただし、そのような区別は常にできるとは限りません。
- すべての要素を選択する場合 (
n == k
以下のコードのケースに対応)
- または要素をまったく選択しない場合 (
k == 0
以下のコードのケースに対応)
これらの場合、解は厳密に 1 つしかないため、
if k == 0:
return 1
if n == k:
return 1
確実に機能するようにする
そのためには、基本ケースが常にある時点でヒットすることを自分自身に納得させる (または証明する) 必要があります。
n < k
ある時点でそれを仮定しましょう。私たちの仮定によれば、n
はもともと より大きいか等しいので、 とが一斉に減少するか、1 だけ減少するため、ある時点がk
あったに違いありません。n = k
n
k
n
これは、subset(n - 1, k)
それが起こるために への呼び出しがあったに違いないことを意味し、それは より下にn
減少しますk
。n = k
ただし、定数を返す場所には基本ケースがあるため、これは不可能1
です。
n
ある時点で のように減少するか、または の正確な回数n = k
で一斉に減少すると結論付けます。k
k = 0
したがって、基本ケースは機能します。