概述
1. 跳台阶
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
分析: 递推公式如下:
f
(
n
)
=
{
1
n
=
1
2
n
=
2
f
(
n
−
1
)
+
f
(
n
−
2
)
n
>
2
f(n)=left{begin{array}{cc}1 & n=1 \ 2 & n=2 \ f(n-1)+f(n-2) & n>2end{array}right.
f(n)=⎩⎨⎧12f(n−1)+f(n−2)n=1n=2n>2
递归
class Solution {
public:
int jumpFloor(int n) {
if(n <= 2) return n;
else return jumpFloor(n-1) + jumpFloor(n-2);
}
};
非递归
class Solution {
public:
int jumpFloor(int n) {
if(n <= 2) return n;
int temp, a1 = 1, a2 = 2;
for(int i = 3; i <= n; i++){
temp = a1 + a2;
a1 = a2;
a2 = temp;
}
return temp;
}
};
2. 变态跳台阶
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
分析: 递推公式如下:
f
(
n
)
=
{
1
n
=
1
2
n
=
2
4
n
=
3
8
n
=
4
.
.
.
.
.
.
f(n)=left{begin{array}{cc}1 & n=1 \ 2 & n=2 \ 4 & n=3 \ 8 & n=4 \ ... & ... end{array}right.
f(n)=⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧1248...n=1n=2n=3n=4...
即
f
(
n
)
=
2
n
−
1
f(n) = 2^{n-1}
f(n)=2n−1 或
f
(
n
)
=
2
f
(
n
−
1
)
f(n) = 2f(n-1)
f(n)=2f(n−1)
f ( n ) = f ( n − 1 ) + f ( n − 2 ) + ⋯ + f ( 1 ) + 1 f(n)=f(n-1)+f(n-2)+ dots +f(1) +1 f(n)=f(n−1)+f(n−2)+⋯+f(1)+1
f ( n − 1 ) = f ( n − 2 ) + ⋯ + f ( 1 ) + 1 f(n-1)=f(n-2)+ dots +f(1) +1 f(n−1)=f(n−2)+⋯+f(1)+1
∴ f ( n ) = 2 f ( n − 1 ) f(n)=2f(n-1) f(n)=2f(n−1)
class Solution {
public:
int jumpFloorII(int n) {
if(n <= 2) return n;
else return 2*jumpFloorII(n-1);
}
};
class Solution {
public:
int jumpFloorII(int n) {
if(n <= 1) return n;
int res = 1;
for(int i = 1; i < n; i++)
res *= 2;
return res;
}
};
3. 跳台阶扩展
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级,也可以跳上3级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
分析: 递推公式如下:
f
(
n
)
=
{
1
n
=
1
2
n
=
2
4
n
=
3
f
(
n
−
1
)
+
f
(
n
−
2
)
+
f
(
n
−
3
)
n
>
3
f(n)=left{begin{array}{cc}1 & n=1 \ 2 & n=2 \ 4 & n=3 \ f(n-1)+f(n-2)+f(n-3) & n>3 end{array}right.
f(n)=⎩⎪⎪⎨⎪⎪⎧124f(n−1)+f(n−2)+f(n−3)n=1n=2n=3n>3
#include <iostream>
using namespace std;
int f(int n){
if(n<=2) return n;
else if(n==3) return 4;
else return f(n-1)+f(n-2)+f(n-3);
}
int main()
{
int n;
cin >> n;
cout << f(n);
return 0;
}
#include <iostream>
using namespace std;
int f(int n){
if(n<=2) return n;
if(n==3) return 4;
int temp, a1=1,a2=2,a3=4;
for(int i = 4; i <= n; i++){
temp = a1+a2+a3;
a1 = a2;
a2 = a3;
a3 = temp;
}
return temp;
}
int main()
{
int n;
cin >> n;
cout << f(n);
return 0;
}
m级,跳n阶台阶为:
f ( n ) = f ( n − 1 ) + f ( n − 2 ) + ⋯ + f ( n − m ) f(n)=f(n-1)+f(n-2)+ dots +f(n-m) f(n)=f(n−1)+f(n−2)+⋯+f(n−m)
f ( n − 1 ) = f ( n − 2 ) + ⋯ + f ( n − m ) + f ( n − 1 − m ) f(n-1)=f(n-2)+ dots +f(n-m)+f(n-1-m) f(n−1)=f(n−2)+⋯+f(n−m)+f(n−1−m)
∴ f ( n ) = 2 f ( n − 1 ) − f ( n − m − 1 ) f(n)=2f(n-1)-f(n-m-1) f(n)=2f(n−1)−f(n−m−1)
4. 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上m级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
递推公式:
f(n) = f(n-1) + f(n-2) + f(n-3) + ... + f(n-m)
f(n-1) = f(n-2) + f(n-3) + ... + f(n-m) + f(n-m-1)
化简得:f(n) = 2f(n-1) - f(n-m-1)
public static int Jump4(int n,int m ) {
//当n大于m的时候是上面的公式
if(n > m){
return 2*Jump4(n-1, m)-Jump4(n-1-m, m);
}
//当n小于等于m的时候就是和n级的相同了
if (n <= 1) {
return 1;
} else {
return 2 * Jump4(n - 1,n);
}
}
}
参考链接:
算法—青蛙跳台阶问题汇总
最后
以上就是激情宝马为你收集整理的跳台阶问题汇总的全部内容,希望文章能够帮你解决跳台阶问题汇总所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复