いいえ、あなたは正しいと思います。再帰的です。これは、古典的な再帰問題であるフィボナッチ数列のバリエーションのようです。
再帰的アルゴリズムには2つの部分があることを忘れないでください。
- ベースケース
- 再帰呼び出し
基本ケースは、これ以上再帰できないポイントを指定します。たとえば、再帰的に並べ替える場合、基本ケースは長さ1のリストです(単一のアイテムが簡単に並べ替えられるため)。
したがって(nが負ではないと仮定すると)、n=0とn=1の2つの基本ケースがあります。関数が0または1に等しいn値を受け取った場合、それ以上再帰することは意味がありません。
そのことを念頭に置いて、コードは次のようになります。
function f(int n):
#check for base case
#if not the base case, perform recursion
それでは、例としてフィボナッチを使用しましょう。
フィボナッチ数列では、各数値はその前の2つの数値の合計です。したがって、シーケンスが与えられると1, 2
、次の番号は明らかに、その後1 + 2 = 3
の番号は2 + 3 = 5
、という3 + 5 = 8
ようになります。一般的に、n番目のフィボナッチ数は(n-1)番目のフィボナッチ数に(n-2)番目のフィボナッチ数を加えたもの、またはf(n) = f(n - 1) + f(n - 2)
しかし、シーケンスはどこから始まりますか?これが基本ケースでした。フィボナッチは彼のシーケンスをから始まると定義しました1, 1
。これは、私たちの目的のために、を意味しますf(0) = f(1) = 1
。それで...
function fibonacci(int n):
if n == 0 or n == 1:
#for any n less than 2
return 1
elif n >= 2:
#for any n 2 or greater
return fibonacci(n-1) + fibonacci(n-2)
else:
#this must n < 0
#throw some error
フィボナッチが再帰とともに教えられる理由の1つは、再帰が悪い考えである場合があることを示しているためです。ここでは説明しませんが、大規模なnの場合、この再帰的アプローチは非常に非効率的です。別の方法は、2つのグローバル変数n1
をn2
使用することです。
n1 = 1
n2 = 1
print n1
print n2
loop:
n = n1 + n2
n2 = n1
n1 = n
print n
シーケンスを印刷します。