palidrome
のための連続する各再帰呼び出しが近いここにあるベースの場合にあなたを持参する必要がありますので、theoritcally言っ
if (i == 0) return "S";
if (i == 1) return "T";
を
palidrome(I-1)およびpalidrome(I- 2)は決して到達しない(i == 0)または(i == 1)
これらのステートメントは最終的には到達されるが間違っているi
が条件を満たすように変更されます。
どうすればvar i
が変わってしまうのでしょうか?この声明を通じて:
は
return palidrome(i-2)
+ palidrome(i-1)
+ palidrome(i-2);
ここでは、再帰的にpalidrome
を呼び出しているが、(i
が減少する)、これは最終的にベースケースにあなたを導くでしょう。
あなたの関数がbase-case
に決して当たっていなければ、無限の再帰がありますが、ここではそうではありません。物事を単純化するために
は、この例を見てみましょう:
は、あなたが彼を訪問ならば、あなたは一度彼を訪問場合はあなたに1個のリンゴを与える寛大な隣人、また別のものを持っていることを前提とし numberOfApplesThatYouGet= numberOfApplesThatYou'veGotIn(currentVisitNumber-1(Which is Last Visit))+numberOfApplesThatYou'veGotIn(currentVisitNumber-2)
と目を仮定することができます:彼はここで、最後の2回(つまり、実際にfibonacci
シーケンスです)ので、一般的なケースであることをあなたに与えたとして、二度、彼はドロドロとしてあなたを与えることから始めましょう currentVisitNumber = n and numberOfApplesThatYouGet = a method called fib
でそう一般的なルールは次のようになります - >
fib(n)=fib(n-1)+fib(n-2)
しかし、我々はまだ無限再帰とここベースケースを終了するbase-case
を必要とすることで、あなたの最初の訪問の条件であります
if(n==0) return 0;//if you didn't visit him you'll get nothing
if(n==1) return 1;//if you did you'll get an apple
ので、メソッドは次のようになります。
public int fib(int n) {
if(n == 0)
return 0;
else if(n == 1)
return 1;
else
return fib(n - 1) + fib(n - 2);
}
あなたは彼に3回訪問したと仮定できますが、いくつのりんごを手に入れますか?
fib(3)->fib(2)+fib(1)
fib(2)->fib(1)+fib(0)->1+0->1
fib(1)->1
1+1=2
#done
またrecursionのより良い理解を形成するために、このを見てみましょう。
* "パリードローム(i-1)とパリンドローム(i-2)は決して到達しません(i == 0)または(i == 1)" * ..これは正しいです。あなたのメソッドはそこで停止しないので、それを読んでください...また、このコードは、負の 'i'値を扱うことができないので、不完全です。 – Tom