剣指offerアルゴリズム(再帰とサイクル)
タイトルの説明では、フィボナッチ数列を知っていますが、整数nを入力するように要求されています.フィボナッチ数列のn番目の項目を出力してください.
タイトルの説明
1匹のカエルは一度に1段の階段を飛び上がることも、2段を飛び上がることもできます.このカエルが1つのn級の階段を跳ぶことを求めて全部で何種類の跳び方があります.
解析:n=1の場合、1中ジャンプしかありません.n=2の場合、2つのジャンプ法があります.n=3の場合、3種類のジャンプ法があります.n=4の場合、5種類のジャンプ法があります.n=5のとき、8種類のジャンプがあります;......法則はFibonacci数列に似ている
1匹のカエルは一度に1段の階段を飛び上がることもできるし、2段も飛び上がることもできるし...n段も飛び上がることもできる.このカエルが1つのn級の階段を跳ぶことを求めて全部で何種類の跳び方があります.
解析:Fib(n)でカエルがn段を飛び上がるジャンプ数を表し、カエルがn段を一度に飛び上がるジャンプ数1(n段ジャンプ)、Fib(0)=1を設定する.n=1の場合、1次ジャンプ:Fib(1)=1のみである.n=2の場合,1次ジャンプと2次ジャンプがある:Fib(2)=Fib(1)+Fib(0)=2;n=3の場合、3種類のジャンプ方式があり、初めて1階を飛び出した後、後ろにはFib(3-1)のジャンプ法がある.初めて2階を飛び出した後、後ろにはFib(3-2)のジャンプ法がある.第1回目の3次ジャンプ後、後ろにはFib(3-3)におけるジャンプ法Fib(3)=Fib(2)+Fib(1)+Fib(0)=4がある.n=nの場合、n種類のジャンプ方式があり、初めて1階を飛び出した後、後ろにはFib(n-1)のジャンプ法がある.1回目の2次ジャンプ後、後ろにはFib(n-2)の中ジャンプが・・・・・・1回目にn階を飛び出すと、後ろにはFib(n-n)のジャンプ法もある.Fib(n) = Fib(n-1)+Fib(n-2)+Fib(n-3)+..........+Fib(n-n)=Fib(0)+Fib(1)+Fib(2)+.......+また、Fib(n-1)は、Fib(n-1)=Fib(0)+Fib(1)+Fib(2)+…….+Fib(n-2)の2式は、Fib(n)−Fib(n−1)=Fib(n−1)=>Fib(n)=2*Fib(n−1)(n>=2)に減算される.
タイトルの説明
2*1の小さな矩形で横になったり、縦になったりして、より大きな矩形を覆うことができます.すみません、n個の2*1の小さい矩形で重ならずに1個の2*nの大きい矩形を覆って、全部で何種類の方法がありますか?
タイトルの説明
2*1の小さな矩形で横になったり、縦になったりして、より大きな矩形を覆うことができます.すみません、n個の2*1の小さい矩形で重ならずに1個の2*nの大きい矩形を覆って、全部で何種類の方法がありますか?
解析:テーマの中の矩形を観察して、2*nの、1つの長尺の形です.単純な長尺形である以上、逆分析である.長尺である以上、後ろから前へ、最後の矩形2*2の場合は、2つのケースしかありません.1つ目は、最後に1つの2*(n-1)の矩形に1つの縦の2*1の矩形を加え、もう1つは2*(n-2)の矩形に2*1の矩形を加え、2つの横の2*1の矩形を加えるので、私たちは得ることができます.第2*n個の矩形の被覆方法は、第(n−1)個の2*1の小矩形に第(n−2)個の2*1の小矩形を加えた方法に等しい.
class Solution {
public:
int Fibonacci(int n) {
if(n==0)
return 0;
else if(n==1)
return 1;
else
// return Fibonacci(n-1)+Fibonacci(n-2);
{
int *array;
array=(int*)malloc(n*sizeof(int));
array[0]=0;
array[1]=1;
for(int i=2;i
タイトルの説明
1匹のカエルは一度に1段の階段を飛び上がることも、2段を飛び上がることもできます.このカエルが1つのn級の階段を跳ぶことを求めて全部で何種類の跳び方があります.
解析:n=1の場合、1中ジャンプしかありません.n=2の場合、2つのジャンプ法があります.n=3の場合、3種類のジャンプ法があります.n=4の場合、5種類のジャンプ法があります.n=5のとき、8種類のジャンプがあります;......法則はFibonacci数列に似ている
class Solution {
public:
int jumpFloor(int number) {
if(number==1)
return 1;
if(number==2)
return 2;
else
return jumpFloor(number-1)+jumpFloor(number-2);
}
};
タイトル説明1匹のカエルは一度に1段の階段を飛び上がることもできるし、2段も飛び上がることもできるし...n段も飛び上がることもできる.このカエルが1つのn級の階段を跳ぶことを求めて全部で何種類の跳び方があります.
解析:Fib(n)でカエルがn段を飛び上がるジャンプ数を表し、カエルがn段を一度に飛び上がるジャンプ数1(n段ジャンプ)、Fib(0)=1を設定する.n=1の場合、1次ジャンプ:Fib(1)=1のみである.n=2の場合,1次ジャンプと2次ジャンプがある:Fib(2)=Fib(1)+Fib(0)=2;n=3の場合、3種類のジャンプ方式があり、初めて1階を飛び出した後、後ろにはFib(3-1)のジャンプ法がある.初めて2階を飛び出した後、後ろにはFib(3-2)のジャンプ法がある.第1回目の3次ジャンプ後、後ろにはFib(3-3)におけるジャンプ法Fib(3)=Fib(2)+Fib(1)+Fib(0)=4がある.n=nの場合、n種類のジャンプ方式があり、初めて1階を飛び出した後、後ろにはFib(n-1)のジャンプ法がある.1回目の2次ジャンプ後、後ろにはFib(n-2)の中ジャンプが・・・・・・1回目にn階を飛び出すと、後ろにはFib(n-n)のジャンプ法もある.Fib(n) = Fib(n-1)+Fib(n-2)+Fib(n-3)+..........+Fib(n-n)=Fib(0)+Fib(1)+Fib(2)+.......+また、Fib(n-1)は、Fib(n-1)=Fib(0)+Fib(1)+Fib(2)+…….+Fib(n-2)の2式は、Fib(n)−Fib(n−1)=Fib(n−1)=>Fib(n)=2*Fib(n−1)(n>=2)に減算される.
class Solution {
public:
int jumpFloorII(int number) {
if(number==0||number==1)
return 1;
else
return 2*jumpFloorII(number-1);
}
};
タイトルの説明
2*1の小さな矩形で横になったり、縦になったりして、より大きな矩形を覆うことができます.すみません、n個の2*1の小さい矩形で重ならずに1個の2*nの大きい矩形を覆って、全部で何種類の方法がありますか?
class Solution {
public:
int rectCover(int number) {
if(number==1)
return 1;
if(number==2)
return 2;
else
return rectCover(number-1)+rectCover(number-2);
}
};
タイトルの説明
2*1の小さな矩形で横になったり、縦になったりして、より大きな矩形を覆うことができます.すみません、n個の2*1の小さい矩形で重ならずに1個の2*nの大きい矩形を覆って、全部で何種類の方法がありますか?
解析:テーマの中の矩形を観察して、2*nの、1つの長尺の形です.単純な長尺形である以上、逆分析である.長尺である以上、後ろから前へ、最後の矩形2*2の場合は、2つのケースしかありません.1つ目は、最後に1つの2*(n-1)の矩形に1つの縦の2*1の矩形を加え、もう1つは2*(n-2)の矩形に2*1の矩形を加え、2つの横の2*1の矩形を加えるので、私たちは得ることができます.第2*n個の矩形の被覆方法は、第(n−1)個の2*1の小矩形に第(n−2)個の2*1の小矩形を加えた方法に等しい.
class Solution {
public:
int rectCover(int number) {
if(number==0)
return 1;
else if(number==1)
return 1;
else if(number==2)
return 2;
else
return rectCover(number-1)+rectCover(number-2);
/*
unsigned int array[71]={1,1,2};
for(int i=3;i<71;i++)
{
array[i]=array[i-1]+array[i-2];
}
return array[number];
*/
}
};