1.斐波那契数列
问题描述
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。n<=39
考察点:递归,找函数通式
从第3项开始,数值为前两项的和。
思路
- 通式:f(n)=f(n-1)+f(n-2) (n>3), f(n)=0 (n=0),f(n)=1 (n=2)。
- 非递归化:依次算出前n项。
- 注意,从第0项开始。f(n)共需计算n-1次累加。
class Solution1:
def Fibonacci(self, n):
# write code here
if n<=0:
return 0
elif n<2:
return n
else:
f1 = 0
f2 = 1
for i in range(n-1):
#执行n-1次,因为f(0)算第0项。
fin = f1+f2
f1 = f2
f2 = fin
return fin
if __name__ == '__main__':
s = Solution1()
print s.Fibonacci(5)
5
2.跳水台
问题描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
考察点:递归,找规律
思路
- 通式:f(n)=f(n-1)+f(n-2) , n>3; f(n)=n ,n<=2。
- 可以转化为开始跳一级台阶,后面有f(n-1)种方法;开始跳2级,后面有f(n-2)种方法,即斐波那契。
- 注意,从第1项开始。f(n)共需计算n-2次累加。
class Solution2:
def jumpFloor(self, number):
# write code here
if number < 1:
return -1
elif (number == 1 or number == 2):
return number
else:
f = 1
s = 2
t = 0
#执行number-2次
for i in range(number-2):
t = f + s
f = s
s = t
return t
if __name__ == '__main__':
s = Solution2()
print s.jumpFloor(5)
8
3.变态跳水台
问题描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
考察点:递归,找规律,数学归纳
思路
- 通项:f(n)=2^(n-1),n>2; f(n)=n,n<=2;
- 借助循环算幂运算
import math
class Solution3:
def jumpFloorII(self, number):
# write code here
if number<1:
return 0
elif number<3:
return number
else:
res = 2
for i in range(number-2):
# 执行number-2次
res = 2*res
return res
if __name__ == '__main__':
s = Solution3()
print s.jumpFloorII(5)
4.矩形覆盖
问题描述
我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
考察点:递归,推公式
思路
- 左上角横放,则左下角也得横放,右侧还有f(n-2)种方法;
- 左下角竖放,则右侧还有f(n-1)种方法;
- 通项:f(n)=f(n-1)+f(n-2),n>3; f(n)=n ,n<=2。
class Solution4:
def rectCover(self, number):
# write code here
if number<1:
return 0
elif number<3:
return number
else:
f1 = 1
f2 = 2
for i in range(number-2):
res = f1+f2
f1 = f2
f2 = res
return res
if __name__ == '__main__':
s = Solution4()
print s.rectCover(5)
8