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

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。

代码详细:

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

代码详细:

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 阶

代码详细:

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。

代码详细:

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柱子上去
期间只有一个原则:一次只能移到一个盘子且大盘子不能在小盘子上面,求移动的步骤和移动的次数

代码详细:

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

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

发布了126 篇原创文章 · 获赞 35 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43442524/article/details/103937979