Just Do IT !

Python算法学习day1:汉诺塔,斐波那契数列(递归)

字数统计: 1.1k阅读时长: 5 min
2020/01/16 Share

1. 斐波那契数列

简单的递归数列问题

(1) 蓝桥杯入门训练:Fibonacci数列

问题描述
Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。

当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。

输入格式
输入包含一个整数n。
输出格式
输出一行,包含一个整数,表示Fn除以10007的余数。
说明:在本题中,答案是要求Fn除以10007的余数,因此我们只要能算出这个余数即可,而不需要先计算出Fn的准确值,再将计算的结果除以10007取余数,直接计算余数往往比先算出原数再取余简单。

样例输入
10
样例输出
55
样例输入
22
样例输出
7704
数据规模与约定
1 <= n <= 1,000,000。

代码详细:

1
2
3
4
5
6
7
8
9
10
11
n = int(input())
a=b = 1
c = 0
if n==1 or n == 2:
print(1)
elif n > 2:
for i in range(3, n+1):
c = (a + b) % 10007
a = b
b = c
print(c)

(2) Leetcode509. 斐波那契数

斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:

F(0) = 0,   F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
给定 N,计算 F(N)。

示例 1:

输入:2
输出:1
解释:F(2) = F(1) + F(0) = 1 + 0 = 1.
示例 2:

输入:3
输出:2
解释:F(3) = F(2) + F(1) = 1 + 1 = 2.
示例 3:

输入:4
输出:3
解释:F(4) = F(3) + F(2) = 2 + 1 = 3.

提示:

0 ≤ N ≤ 30

代码详细:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Solution(object):
def fib(self, N):
"""
:type N: int
:rtype: int
"""
# 第一次提交的代码,优化的不是很好
"""
a=1
b=1
c=0
if N == 0 :
return 0
elif N==1 or N==2:
return 1
else:
for i in range(3,N+1):
c=a+b
a=b
b=c
return c
"""
# 最优解
if N in (0, 1):
return N

a=0
b=1
for i in range(2,N+1):
temp=a
a=b
b=temp+a
return b

(3) LeetCode70. 爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

注意:给定 n 是一个正整数。

示例 1:

输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1.  1 阶 + 1 阶
2.  2 阶
示例 2:

输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
3.  1 阶 + 1 阶 + 1 阶
4.  1 阶 + 2 阶
5.  2 阶 + 1 阶

代码详细:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class Solution(object):
def climbStairs(self, n):
"""
:type n: int
:rtype: int
"""
# 第一次提交的代码,优化的不是很好
"""
a=1
b=1
c=0

if n==1:
return a
elif n==2:
return a+b
else:
for i in range(2, n+1):
c=a+b
a=b
b=c
return c

"""
#最优解 使用了append列表函数添加数字
lis = []
lis.append(1)
lis.append(2)
if n==1:
return 1
if n==2:
return 2
for i in range(2, n):
lis.append(lis[i-1]+lis[i-2])
return lis[-1]

(4) LeetCode1137. 第 N 个泰波那契数

泰波那契序列 Tn 定义如下: 
T0 = 0, T1 = 1, T2 = 1, 且在 n >= 0 的条件下 Tn+3 = Tn + Tn+1 + Tn+2
给你整数 n,请返回第 n 个泰波那契数 Tn 的值。
示例 1:

输入:n = 4
输出:4
解释:
T_3 = 0 + 1 + 1 = 2
T_4 = 1 + 1 + 2 = 4
示例 2:

输入:n = 25
输出:1389537


提示:

0 <= n <= 37
答案保证是一个 32 位整数,即 answer <= 2^31 - 1。

代码详细:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution(object):
def tribonacci(self, n):
"""
:type n: int
:rtype: int
"""
if n in (0, 1):
return n

lis=[]
lis.append(0)
lis.append(1)
lis.append(1)
for i in range(3,n+1):
lis.append(lis[i-1]+lis[i-2]+lis[i-3])
return lis[-1]

2. 汉诺塔

如下图所示,从左到右有A、B、C三根柱子,其中A柱子上面有从小叠到大的n个圆盘,现要求将A柱子上的圆盘移到C柱子上去
期间只有一个原则:一次只能移到一个盘子且大盘子不能在小盘子上面,求移动的步骤和移动的次数

代码详细:

1
2
3
4
5
6
7
8
9
10
def Move(n, A, B, C):
count = 0
if n == 1:
print(A, "==>", C)
return 1
else:
count += Move(n-1, A, C, B) # 将A上的n-1个盘子经过C移动到B
count += Move(1, A, B, C) # 将A上的最底部的盘子经过B移动到C
count += Move(n-1, B, A, C) # 将B上的n-1个盘子经过A移动到C
return count

以上就是一些递归的经典算法,再接再厉,每日学习一点算法,然后温故而知新。

CATALOG
  1. 1. 1. 斐波那契数列
    1. 1.1. (1) 蓝桥杯入门训练:Fibonacci数列
    2. 1.2. (2) Leetcode509. 斐波那契数
    3. 1.3. (3) LeetCode70. 爬楼梯
    4. 1.4. (4) LeetCode1137. 第 N 个泰波那契数
  2. 2. 2. 汉诺塔