8.2 变态跳台阶
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
解题思路
对于本题,有 一次 1阶或者2阶的跳法,也有一次n阶的跳法。
f(1) = 1
f(2) = f(2-1) + f(2-2) //f(2-2) 表示2阶一次跳2阶的次数。
f(3) = f(3-1) + f(3-2) + f(3-3)
...
f(n) = f(n-1) + f(n-2) + f(n-3) + ... + f(n-(n-1)) + f(n-n)
n = 1时,只有1种跳法,
f(1) = 1
n = 2时,会有一次1阶或者2阶两种跳的方式,,这回归到了问题(1) ,
f(2) = f(2-1) + f(2-2)
n = 3时,会有1阶、2阶、3阶,三种跳的方式;那么就是第一次跳出1阶后面剩下:f(3-1);第一次跳出2阶,剩下f(3-2);第一次3阶,那么剩下f(3-3)
则:f(3) = f(3-1) + f(3-2) + f(3-3)
n = n时,会有,1阶、2阶…n阶;总共n中跳的方式,则:
f(n) = f(n-1)+f(n-2)+...+f(n-(n-1)) + f(n-n) => f(0) + f(1) + f(2) + f(3) + ... f(n-2)+ f(n-1)
上面4的表达式可以看到
f(n) = f(0)+f(1)+...+f(n-2)+f(n-1)
,f(n-1) = f(0)+f(1)+...+f(n-2)
;则f(n) = f(n-1)+f(n-1)
简化后可以写成:f(n) = 2 * f(n-1)
f(n) = 2*f(n-1)=2^2 * f(n-2)= ... = 2^{n-1} * f(1) = 2^{n-1}
代码实现
java 代码
/** * 递归变态跳台阶,可以跳1阶,2阶...n阶 * 时间复杂度 O(n) * @param n 总阶数 * @return */ public int jumpFloorII(int n) { if (n == 1) { return 1; } else { return 2 * jumpFloorII(n - 1); } } /** * 数学公式发变态跳台阶,可以跳1阶,2阶...n阶 * ∵ f(n) = f(0)+f(1)+...+f(n-2)+f(n-1) * f(n-1) = f(0)+f(1)+...+f(n-2) * ∴ f(n) = f(n-1)+f(n-1) * f(n) = 2 * f(n-1)=2^2 * f(n-2)= ... = 2^{n-1} * f(1) = 2^{n-1} * 时间复杂度 O(1) * @param n 总阶数 * @return */ public int jumpFloorIIMath(int n) { return (int) Math.pow(2, n - 1); } /** * 迭代发变态跳台阶,可以跳1阶,2阶...n阶 * 时间复杂度 O(n) * @param n 总阶数 * @return */ public int jumpFloorIIFor(int n) { if (n == 1) { return 1; } else { int c = 1; for (int i = 2; i <= n; i++) { c *= 2; } return c; } } public static void main(String[] args){ System.out.println(jumpFloorII(9)); System.out.println(jumpFloorIIMath(9)); System.out.println(jumpFloorIIFor(9)); }
Kotlin 代码
/**
* 递归变态跳台阶,可以跳1阶,2阶...n阶
* 时间复杂度 O(n)
* @param n 总阶数
* @return
*/
private fun jumpFloorII(n: Int): Int {
return if (n == 1) {
1
} else {
2 * jumpFloorII(n - 1)
}
}
/**
* 数学公式发变态跳台阶,可以跳1阶,2阶...n阶
* ∵ f(n) = f(0)+f(1)+...+f(n-2)+f(n-1)
* f(n-1) = f(0)+f(1)+...+f(n-2)
* ∴ f(n) = f(n-1)+f(n-1)
* f(n) = 2 * f(n-1)=2^2 * f(n-2)= ... = 2^{n-1} * f(1) = 2^{n-1}
* 时间复杂度 O(1)
* @param n 总阶数
* @return
*/
private fun jumpFloorIIMath(n: Int): Int {
return 2.0.pow(n - 1.toDouble()).toInt()
}
/**
* 迭代发变态跳台阶,可以跳1阶,2阶...n阶
* 时间复杂度 O(n)
* @param n 总阶数
* @return
*/
private fun jumpFloorIIFor(n: Int): Int {
return if (n == 1) {
1
} else {
var c = 1
for (i in 2..n) {
c *= 2
}
c
}
}
/**
* 入口函数
*/
fun main(args: Array<String>) {
println(jumpFloorII(9))
println(jumpFloorIIMath(9))
println(jumpFloorIIFor(9))
}
引用声明
该题目引用自
牛客网