斐波那契数列
题目:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项。
斐波那契数列的定义如下:
f
(
n
)
=
{
0
n=0
1
n=1
f
(
n
−
1
)
+
f
(
n
−
2
)
n>1
f(n)= \begin{cases} 0& \text{n=0}\\ 1& \text{n=1}\\ f(n-1)+f(n-2)& \text{n>1} \end{cases}
f(n)=⎩⎪⎨⎪⎧01f(n−1)+f(n−2)n=0n=1n>1
解法1:递归(时间复杂度高,无法编译通过)
- 时间复杂度 O ( n 2 ) O(n^2) O(n2)
class solution:
def fab(self, n):
if n == 0:
return 0
if n == 1:
return 1
else:
return self.fab(n-1) + self.fab(n-2)
解法2:非递归
- 思路: 从小往上计算,根据f(0)和f(1)算出f(2), f(1)和f(2)算出f(3), 以此类推算出第n项,时间复杂度O(n)
# -*- coding:utf-8 -*-
class Solution:
def Fibonacci(self, n):
if n == 0:
return 0
if n == 1:
return 1
else:
sum = 0
a = 0
b = 1
while n >1:
sum = a+b
# 保留大的数,把小的舍掉
a = b
b = sum
n -= 1
return sum
# write code here
青蛙跳台
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
解法
- 思路:第一次跳的情况: 若跳1级, 剩下n-1级, 跳法有f(n-1)种;若跳2级, 剩下n-2级, 跳法有f(n-2)种。于是,f(n) = f(n-1) + f(n-2), 这样就是一个斐波那契数列了
# -*- coding:utf-8 -*-
class Solution:
def jumpFloor(self, number):
# write code here
if number == 1:
return 1
if number == 2:
return 2
else:
j_one = 1
j_two = 2
sum = 0
for i in range(2, number):
sum = j_one + j_two
j_one = j_two
j_two = sum
return sum
变态跳台阶
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
解法
- 思路: 考虑第一次跳的情况:若跳了1级,剩下n-1级, 有f(n-1)种跳法; 跳了2级, 就有f(n-2)种跳法;…; 若跳了n-2级, 有f(2) = 2种, 若跳了n-1级, 有f(1)=1种, 若跳了n级, 有f(0)=1种;
于是f(n) = f(0) + f(1) + … + f(n-1)
f(1) = f(0) = 1 = 2^0
f(2) = f(1) + f(0) = 2 = 2^1
f(3) = f(2) + f(1) + f(0) = f(2) + f(2) = 2f( 2) = 2^2
…
于是可以发现
f(n) = 2 f(n-1) = 2^(n-1)
# -*- coding:utf-8 -*-
class Solution:
def jumpFloorII(self, number):
# write code here
if number == 1:
return 1
a = 1
sum = 0
for i in range(1, number):
sum = 2* a
a = sum
return sum
或者
# -*- coding:utf-8 -*-
class Solution:
def jumpFloorII(self, number):
# write code here
return pow(2, number-1)