Python for Kids
  • 0 前言
  • 1 编程环境准备
  • 2 运算符和表达式
  • 3 掌握变量
  • 4 字符串
  • 5 获取用户的输入
  • 6 条件判断
  • 7 条件判断实操
  • 8 FOR循环
  • 9 循环和列表
  • 10 WHILE循环
  • 11 WHILE循环实操
  • 12 WHILE循环再实操
  • 13 多重循环
  • 14 再谈列表
  • 15 初见函数
  • 16 函数实操
  • 17 选择排序
  • 18 冒泡排序
  • 19 递归算法之一
  • 20 递归算法实操
  • 21 快速排序
  • 22 汉诺塔游戏
  • 23 递推算法
  • 24 分治算法
  • 25 集合与组合
  • 26 贪心算法
  • 27 字典和键值对
  • 28 广度优先搜索算法
  • 29 数组和向量化计算
  • 30 随机和模拟
  • 31 数据可视化
  • 32 文件读取和分析
Powered by GitBook
On this page
  • 大纲
  • 练习:斐波那契数列
  • 练习:青蛙跳台阶
  • 练习:兔子繁殖问题

Was this helpful?

20 递归算法实操

奇妙的想法更需要反复练习

大纲

  • 练习:斐波那契数列

  • 练习:青蛙跳台阶

  • 练习:兔子繁殖问题

练习:斐波那契数列

斐波那契数列是指这项数字等于前面两项数字之和的序列

1、1、2、3、5、8、13、21、34、……

让我们用递归算法来实现一下,如何计算出数列的第N项

def fibonacci(n):
    if n<= 2:
        return 1     # 停止条件
    else:
        return fibonacci(n-1)+fibonacci(n-2)  # 分拆

fibonacci(8)
21
for x in range(1,10):
    print(fibonacci(x))
1
1
2
3
5
8
13
21
34

如果要算出所有的数字,可以直接用列表解析。

[fibonacci(x) for x in range(1,10)]
[1, 1, 2, 3, 5, 8, 13, 21, 34]

练习:青蛙跳台阶

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

每次跳的时候,小青蛙可以跳一个台阶,也可以跳两个台阶,也就是说,每次跳的时候,小青蛙有两种跳法。第一种跳法:第一次我跳了一个台阶,那么还剩下n-1个台阶还没跳,剩下的n-1个台阶的跳法有f(n-1)种。第二种跳法:第一次跳了两个台阶,那么还剩下n-2个台阶还没,剩下的n-2个台阶的跳法有f(n-2)种。所以,小青蛙的全部跳法就是这两种跳法之和了,即 f(n) = f(n-1) + f(n-2)。

def taijie(n):
    if n<= 2:
        return n     # 停止条件
    else:
        return taijie(n-1)+taijie(n-2)  # 分拆

taijie(8)
34

练习:兔子繁殖问题

有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

第n月的时候的兔子包括两种,一种是当前新生的兔子,另一种是以前的老兔子,新兔子的数量等于两个月前的老兔子数量,以前的老兔子数量就是一个月前的老兔子数量,所以F(n) = F(n-1)+F(n-2)

def tuzi(n):
    if n<= 2:
        return 2     # 停止条件
    else:
        return tuzi(n-1)+tuzi(n-2)  # 分拆

tuzi(8)
42
[tuzi(x) for x in range(1,12)]
[2, 2, 4, 6, 10, 16, 26, 42, 68, 110, 178]

假设兔子寿命是8个月,1月出生的兔子到了9月就会死亡,那么上面这个问题里,到了两年后兔子总数会是多少?

第n月的时候的兔子数量除了新兔子和老兔子,还要考虑8个月前的兔子,所以F(n) = F(n-1)+F(n-2)-F(n-8)

def tuzi(n):
    if n<= 2:
        return 2     # 停止条件
    else:
        if n<=8:
            return tuzi(n-1)+tuzi(n-2) # 分拆
        else:
            return tuzi(n-1)+tuzi(n-2)-tuzi(n-8)
[tuzi(x) for x in range(1,12)]
[2, 2, 4, 6, 10, 16, 26, 42, 66, 106, 168]
tuzi(24)
70040
Previous19 递归算法之一Next21 快速排序

Last updated 4 years ago

Was this helpful?