【10月更文挑战第16天】「Mac上学Python 27」小学奥数篇13 - 动态规划入门

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时计算 Flink 版,1000CU*H 3个月
简介: 本篇将通过 Python 和 Cangjie 双语介绍动态规划的基本概念,并解决一个经典问题:斐波那契数列。学生将学习如何使用动态规划优化递归计算,并掌握编程中的重要算法思想。

本篇将通过 PythonCangjie 双语介绍动态规划的基本概念,并解决一个经典问题:斐波那契数列。学生将学习如何使用动态规划优化递归计算,并掌握编程中的重要算法思想。

fibonaccifibonacci.png


关键词
  • 小学奥数
  • Python + Cangjie
  • 动态规划
  • 斐波那契数列

一、题目描述

斐波那契数列的定义如下:

  • F(0) = 0, F(1) = 1
  • F(n) = F(n-1) + F(n-2)(当 n ≥ 2)

请编写程序,接收一个非负整数 n,并输出 F(n) 的值。要求使用动态规划解决问题,以避免重复计算。

输入格式

  • 一个非负整数 n

输出格式

  • 输出 F(n) 的值。

解题思路
  1. 递归问题的优化:普通递归会导致大量重复计算。使用动态规划将计算结果存储起来,避免重复运算。
  2. 动态规划实现方式:采用自底向上的方式,逐步计算每个状态的结果。

二、Python 实现

import matplotlib.pyplot as plt

# 计算斐波那契数列的第 n 项
def fibonacci(n):
    dp = [0] * (n + 1)  # 初始化数组
    if n > 0:
        dp[1] = 1

    for i in range(2, n + 1):
        dp[i] = dp[i - 1] + dp[i - 2]

    return dp[n], dp  # 返回结果和完整序列

# 绘制斐波那契数列的图像并保存
def plot_fibonacci_sequence(n):
    _, sequence = fibonacci(n)
    plt.plot(range(n + 1), sequence, marker='o')
    plt.title(f"斐波那契数列前 {n} 项")
    plt.xlabel("n")
    plt.ylabel("F(n)")
    plt.grid(True)
    filename = "fibonacci_sequence.png"
    plt.savefig(filename)  # 保存图像到本地
    print(f"图形已保存为 {filename}")
    plt.show()

# 输入并计算
n = int(input("请输入一个非负整数 n: "))
result, _ = fibonacci(n)
print(f"F({n}) = {result}")

plot_fibonacci_sequence(n)  # 绘制并保存图像

三、Cangjie 实现

package cjcDemo

// 导入必要的标准库模块
import std.convert.*    // 数据类型转换模块
import std.console.*    // 控制台输入输出模块

// 定义一个函数,读取用户输入的整数,并返回 Int64 类型的值
func inputInt(info: String): Int64 {
    print(info)  // 输出提示信息到控制台
    let number: Int64 = Int64.parse(Console.stdIn.readln().getOrThrow())  // 读取用户输入并转换为 Int64
    return number  // 返回输入的整数
}

// 计算斐波那契数列的第 n 项,并返回该项的值及完整数列
func fibonacci(n: Int64): (Int64, Array<Int64>) {
    // 创建一个大小为 n+1 的数组,用于存储斐波那契数列的各项,初始化为 0
    let dp = Array<Int64>(n + 1, repeat: 0)

    // 如果 n 大于 0,则设置第一项为 1(F(1) = 1)
    if (n > 0) {
        dp[1] = 1
    }

    // 使用循环计算斐波那契数列的每一项,避免重复计算
    for (i in 2..=n) {
        dp[i] = dp[i - 1] + dp[i - 2]  // 当前项为前两项之和
    }

    // 返回第 n 项的值和完整的斐波那契数列数组
    return (dp[n], dp)
}

// 主函数,程序入口
main(): Int64 {
    // 调用 inputInt 函数,提示用户输入非负整数 n
    let n = inputInt("请输入一个非负整数 n: ")

    // 调用 fibonacci 函数,计算第 n 项及完整的斐波那契数列
    let (result, sequence) = fibonacci(n)

    // 输出第 n 项的值
    println("F(${n}) = ${result}")

    // 输出斐波那契数列的所有项
    println("斐波那契序列:")
    for (i in 0..sequence.size) {
        println("F(${i}) = ${sequence[i]}")  // 按格式输出每一项的值
    }

    return 0  // 返回 0 表示程序成功执行
}

代码详解
  1. 存储中间结果:使用数组保存每一步计算的结果,避免重复运算。
  2. Python 中,绘制斐波那契数列的图像并保存为本地文件。
  3. Cangjie 实现输出整个斐波那契序列,帮助学生理解计算过程。

示例执行

示例 1

输入:
n = 5
输出:
F(5) = 5

示例 2

输入:
n = 10
输出:
F(10) = 55

四、图形展示

以下代码展示了斐波那契数列的前 10 项,并保存为 fibonacci_sequence.png

plot_fibonacci_sequence(10)

生成的图像如下:
fibonacci_sequence.pngfibonacci_sequence.png


小结

通过这道斐波那契数列的题目,学生学习了动态规划的思想,并理解了如何使用编程优化递归算法。动态规划是一种重要的算法思想,常用于解决多阶段决策问题。


上一篇: 「Mac上学Python 26」小学奥数篇12 - 图形变换与坐标计算

下一篇: 「Mac上学Python 28」基础篇9 - 条件语句与逻辑判断


目录
相关文章
|
19天前
|
SQL 关系型数据库 数据库
Python SQLAlchemy模块:从入门到实战的数据库操作指南
免费提供Python+PyCharm编程环境,结合SQLAlchemy ORM框架详解数据库开发。涵盖连接配置、模型定义、CRUD操作、事务控制及Alembic迁移工具,以电商订单系统为例,深入讲解高并发场景下的性能优化与最佳实践,助你高效构建数据驱动应用。
187 7
|
2月前
|
测试技术 开发者 Python
Python单元测试入门:3个核心断言方法,帮你快速定位代码bug
本文介绍Python单元测试基础,详解`unittest`框架中的三大核心断言方法:`assertEqual`验证值相等,`assertTrue`和`assertFalse`判断条件真假。通过实例演示其用法,帮助开发者自动化检测代码逻辑,提升测试效率与可靠性。
261 1
|
1月前
|
Cloud Native 算法 API
Python API接口实战指南:从入门到精通
🌟蒋星熠Jaxonic,技术宇宙的星际旅人。深耕API开发,以Python为舟,探索RESTful、GraphQL等接口奥秘。擅长requests、aiohttp实战,专注性能优化与架构设计,用代码连接万物,谱写极客诗篇。
Python API接口实战指南:从入门到精通
|
1月前
|
存储 Java 调度
Python定时任务实战:APScheduler从入门到精通
APScheduler是Python强大的定时任务框架,通过触发器、执行器、任务存储和调度器四大组件,灵活实现各类周期性任务。支持内存、数据库、Redis等持久化存储,适用于Web集成、数据抓取、邮件发送等场景,解决传统sleep循环的诸多缺陷,助力构建稳定可靠的自动化系统。(238字)
348 1
|
2月前
|
调度 数据库 Python
Python异步编程入门:asyncio让并发变得更简单
Python异步编程入门:asyncio让并发变得更简单
161 5
|
2月前
|
数据采集 存储 XML
Python爬虫入门(1)
在互联网时代,数据成为宝贵资源,Python凭借简洁语法和丰富库支持,成为编写网络爬虫的首选。本文介绍Python爬虫基础,涵盖请求发送、内容解析、数据存储等核心环节,并提供环境配置及实战示例,助你快速入门并掌握数据抓取技巧。
|
2月前
|
大数据 数据处理 数据安全/隐私保护
Python3 迭代器与生成器详解:从入门到实践
简介:本文深入解析Python中处理数据序列的利器——迭代器与生成器。通过通俗语言与实战案例,讲解其核心原理、自定义实现及大数据处理中的高效应用。
123 0
|
2月前
|
存储 缓存 安全
Python字典:从入门到精通的实用指南
Python字典如瑞士军刀般强大,以键值对实现高效数据存储与查找,广泛应用于配置管理、缓存、统计等场景。本文详解字典基础、进阶技巧、实战应用与常见陷阱,助你掌握这一核心数据结构,写出更高效、优雅的Python代码。
68 0
|
3月前
|
数据挖掘 数据处理 C++
Python Lambda:从入门到实战的轻量级函数指南
本文通过10个典型场景,详解Python中Lambda匿名函数的用法。Lambda适用于数据处理、排序、条件筛选、事件绑定等简洁逻辑,能提升代码简洁性和开发效率。同时提醒避免在复杂逻辑中过度使用。掌握Lambda,助你写出更高效的Python代码。
189 0
|
3月前
|
数据采集 Web App开发 JSON
Python爬虫基本原理与HTTP协议详解:从入门到实践
本文介绍了Python爬虫的核心知识,涵盖HTTP协议基础、请求与响应流程、常用库(如requests、BeautifulSoup)、反爬应对策略及实战案例(如爬取豆瓣电影Top250),帮助读者系统掌握数据采集技能。
246 0

推荐镜像

更多