「Mac玩转仓颉内测版50」小学奥数篇13 - 动态规划入门
本篇将通过 Python 和 Cangjie 双语介绍动态规划的基本概念,并解决一个经典问题:斐波那契数列。学生将学习如何使用动态规划优化递归计算,并掌握编程中的重要算法思想。
关键词
- 小学奥数
- Python + Cangjie
- 动态规划
- 斐波那契数列
一、题目描述
斐波那契数列的定义如下:
- F(0) = 0, F(1) = 1
- F(n) = F(n-1) + F(n-2)(当 n ≥ 2)
请编写程序,接收一个非负整数 n,并输出 F(n) 的值。要求使用动态规划解决问题,以避免重复计算。
输入格式:
- 一个非负整数 n。
输出格式:
- 输出 F(n) 的值。
解题思路
- 递归问题的优化:普通递归会导致大量重复计算。使用动态规划将计算结果存储起来,避免重复运算。
- 动态规划实现方式:采用自底向上的方式,逐步计算每个状态的结果。
二、Python 实现
import matplotlib.pyplot as plt# 计算斐波那契数列的第 n 项
def fibonacci(n):dp = [0] * (n + 1) # 初始化数组if n > 0:dp[1] = 1for 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()) // 读取用户输入并转换为 Int64return number // 返回输入的整数
}// 计算斐波那契数列的第 n 项,并返回该项的值及完整数列
func fibonacci(n: Int64): (Int64, Array<Int64>) {// 创建一个大小为 n+1 的数组,用于存储斐波那契数列的各项,初始化为 0let 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 函数,提示用户输入非负整数 nlet 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 表示程序成功执行
}
代码详解
- 存储中间结果:使用数组保存每一步计算的结果,避免重复运算。
- Python 中,绘制斐波那契数列的图像并保存为本地文件。
- Cangjie 实现输出整个斐波那契序列,帮助学生理解计算过程。
示例执行
示例 1:
输入:
n = 5
输出:
F(5) = 5
示例 2:
输入:
n = 10
输出:
F(10) = 55
四、图形展示
以下代码展示了斐波那契数列的前 10 项,并保存为 fibonacci_sequence.png:
plot_fibonacci_sequence(10)
生成的图像如下:

小结
通过这道斐波那契数列的题目,学生学习了动态规划的思想,并理解了如何使用编程优化递归算法。动态规划是一种重要的算法思想,常用于解决多阶段决策问题。
上一篇: 「Mac玩转仓颉内测版49」小学奥数篇12 - 图形变换与坐标计算
下一篇: 「Mac玩转仓颉内测版51」基础篇13 - 高阶函数与闭包
作者:SoraLuna
链接:https://www.nutpi.net/thread?topicId=399
來源:坚果派
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
相关文章:
「Mac玩转仓颉内测版50」小学奥数篇13 - 动态规划入门
本篇将通过 Python 和 Cangjie 双语介绍动态规划的基本概念,并解决一个经典问题:斐波那契数列。学生将学习如何使用动态规划优化递归计算,并掌握编程中的重要算法思想。 关键词 小学奥数Python Cangjie动态规划斐波那契数列 一、题目描述 …...
前端退出对话框也就是点击右上角的叉,显示灰色界面,已经解决
文章目录 遇到一个前端bug,点击生成邀请码 打开对话框 然后我再点击叉号,退出对话框,虽然退出了对话框,但是显示灰色界面。如下图: 导致界面就会失效,点击任何地方都没有反应。 发现是如下代码的问题&am…...
使div每次隐藏显示后都从顶部开始
<div ref"addmodel" > <!-- 这里内容很长,超出屏幕。。。 --> </div> methods:{ // 页面显示时滚动至顶部 scrollToTop() { const addmodel this.$refs.addmodel; if (addmodel) { addmodel.scrollTop 0; } }, } 在div每次显示或者…...
资源付费软件开发 资源付费系统源码 资源付费类型小程序APP
应用场景 资源付费软件广泛应用于多个领域,以下是其主要应用场景: 在线教育: 各类教育机构、名师通过资源付费软件提供课程、讲座等学习资源,为学生提供个性化的学习服务。用户可以通过软件学习专业知识、职业技能等,…...
文件的读写
所涉及到的函数如下:<stdio.h> 函数介绍网站:cplusplus.com - The C Resources Network 读写文件之前要先打开文件,使用完要关闭文件归返空间: fopen 打开 fclose 关闭 返回的是FILE*型,第一个参数是文…...
城市大脑新型智慧城市数据中台建设方案
建设背景与现状 随着城市化进程的加速,城市数据呈现出爆炸式增长,但数据的整合、共享和利用却面临诸多挑战。信息孤岛、数据冗余、管理分散等问题日益突出,制约了智慧城市的发展。为了解决这些问题,构建城市大脑新型智慧城市数据…...
二三(Node2)、Node.js 模块化、package.json、npm 软件包管理器、nodemon、Express、同源、跨域、CORS
1. Node.js 模块化 1.1 CommonJS 标准 utils.js /*** 目标:基于 CommonJS 标准语法,封装属性和方法并导出*/ const baseURL "http://hmajax.itheima.net"; const getArraySum (arr) > arr.reduce((sum, item) > (sum item), 0);mo…...
【sgFileLink】自定义组件:基于el-link、el-icon标签构建文件超链接组件,支持垃圾桶删除、点击预览视频/音频/图片/PDF格式文件
sgFileLink源代码 <template><div :class"$options.name"><el-link click.stop"clickFile(data)"><img :src"getSrc(data)" /><span>{{ getFileNameAndSize(data) }}</span></el-link><el-linkcl…...
Kafka - 消息乱序问题的常见解决方案和实现
文章目录 概述一、MQ消息乱序问题分析1.1 相同topic内的消息乱序1.2 不同topic的消息乱序 二、解决方案方案一: 顺序消息Kafka1. Kafka 顺序消息的实现1.1 生产者:确保同一业务主键的消息发送到同一个分区1.2 消费者:顺序消费消息 2. Kafka 顺…...
【golang】匿名内部协程,值传递与参数传递
代码例子 下面代码的区别是直接调用循环变量,这里使用的就是这个变量的引用,而不是将参数的副本传递给协程执行 for task : range taskChan {wg.Add(1)go func() {defer wg.Done()task.Do() // 使用外部循环变量}() }func DistributeTasks(taskChan &…...
Jenkins与SonarQube持续集成搭建及坑位详解
Jenkins和SonarQube都是软件开发过程中常用的工具,它们在代码管理、构建、测试和质量管理方面发挥着重要作用。以下是关于Jenkins与SonarQube的作用及整合步骤环境搭建的详细解释: 一、Jenkins与SonarQube的作用 Jenkins: Jenkins是一个开源的持续集成和交付工具,它可以帮…...
.NET6 WebAPI从基础到进阶--朝夕教育
1、环境准备 1. Visual Studio 2022 2. .NET6 平台支持 3. Internet Information Services 服务器( IIS ) 4. Linux 服务器 【 CentOS 系统】 ( 跨平台部署使用 ) 5. Linux 服务器下的 Docker 容器( Docker 部署使用) …...
购物车案例--分模块存储数据,发送请求数据渲染,底部总计数量和价格
shift鼠标右键,打开powershell,新建项目 自定义 只有一个页面,不涉及路由,勾选vuex,css,babel 无需保存预设 回车项目开始创建 项目用vscode打开 将src里的内容全部清空 将第七天的课程准备代码复制粘贴到src中 刷新页面&…...
PCIe学习笔记
PCIE高速串行数据总线 当拿到一块板子 比如你要用到PCIE 首先要看这块板子的原理图 一般原理图写的是 PCI express 表示PCIE 以下是Netfpga为例下的PCIE插口元件原理图 的特点主要体现在它如何结合传统面向对象编程(OOP)的理念与LabVIEW的图形化编程模式,提供灵活的抽象和模块化的功能。以下是LabVIEW面向对象编程的几个主要特点: 1. 类&#x…...
配置Nginx自签名SSL证书,支持HTTPS
配置Nginx自签名SSL证书的流程 生成一个SSL自签名证书客户端机器信任这个自签名证书修改RHEL服务器的Nginx配置在客户机用curl测试HTTPS 生成一个SSL自签名证书 在RHEL服务器上, 用openssl命令生成一个自签名证书 openssl genrsa -out server.key 2048 #生成一个2048位的RS…...
使用Spring Boot、VUE实现SSE长连接:跟踪文件上传和任务进度
使用Spring Boot实现SSE长连接:跟踪文件上传和任务进度 文章目录 使用Spring Boot实现SSE长连接:跟踪文件上传和任务进度什么是SSE?使用场景前端库选择安装event-source-polyfill1. 创建SSE连接2. 关闭SSE连接3. 结合Vue.js使用 使用Spring B…...
造相-Z-Image-Turbo 在运维监控中的创意应用:生成系统状态拟人化报告图
造相-Z-Image-Turbo 在运维监控中的创意应用:生成系统状态拟人化报告图 每次打开监控大屏,面对满屏跳动的数字和密密麻麻的曲线图,你是不是也感到一阵视觉疲劳?CPU 80%、内存占用率65%、网络丢包0.1%……这些冰冷的指标虽然精确&…...
Java学习——数据类型
目录 一、概述 二、基本数据类型 1、数值型 2、字符型 3、布尔型 三、引用数据类(后期补充) 1、类 2、接口 3、数组 4、枚举 5、注解 四、数据类型转换 1、概述 2、隐式转换(自动类型转换) 3、显式转换(…...
深入Linux 0.11内核:从_syscall1宏到系统调用表的完整链路拆解
深入Linux 0.11内核:从_syscall1宏到系统调用表的完整链路拆解 在操作系统的演进历程中,系统调用机制始终扮演着用户程序与内核服务之间的关键桥梁角色。对于希望真正理解计算机系统底层运作的开发者而言,掌握系统调用的完整实现链路不仅是提…...
5步搞定:Z-Image-Turbo_UI界面LoRA使用教程,轻松玩转多种画风
5步搞定:Z-Image-Turbo_UI界面LoRA使用教程,轻松玩转多种画风 作为一名AI绘画工具的重度使用者,我深知新手最需要的是什么——不是复杂的参数解释,而是简单明了的操作指南。今天要介绍的Z-Image-Turbo_UI界面,可能是你…...
技术面试终极指南:10个反向面试技巧助你问对公司问题
技术面试终极指南:10个反向面试技巧助你问对公司问题 【免费下载链接】reverse-interview Questions to ask the company during your interview 项目地址: https://gitcode.com/gh_mirrors/re/reverse-interview 在技术面试中,反向面试ÿ…...
CentOS 7.9 搭建 NTP 服务器
1、环境准备 1.1、CentOS 7.9系统 1.2、更换YUM源为本地或外网源 1.3、更换系统IP地址为静态地址 2、YUM 安装 NTP yum -y install ntp 3、配置NTP服务器 3.1、编辑 /etc/ntp.conf vi /etc/ntp.conf 3.2、如果你想同步外部 NTP 服务器,注释这四条内容 3.3、在下…...
Webpack Tree Shaking配置终极指南:如何在Awesome-Webpack中优化现代前端项目
Webpack Tree Shaking配置终极指南:如何在Awesome-Webpack中优化现代前端项目 【免费下载链接】awesome-webpack A curated list of awesome Webpack resources, libraries and tools 项目地址: https://gitcode.com/gh_mirrors/aw/awesome-webpack Webpack …...
WebGL/Three.js性能优化实战:你的3D模型为什么卡?从理解栅格化与渲染管线开始
WebGL/Three.js性能优化实战:从栅格化原理到渲染管线调优 当你用Three.js加载一个精致的3D模型时,是否遇到过页面突然卡顿、风扇狂转的情况?这背后往往与浏览器如何将矢量图形转换为屏幕像素的过程密切相关。今天我们就从栅格化的底层原理出发…...
华泰证券2027届校招启动|提前批+国际管培+金融科技,三个专场一次说清
导读很多同学还在等“春招后半场捡漏”,但现实已经变了。头部企业的优质岗位,正在通过提前批 专项项目提前锁定人选。如果你现在才开始准备,很可能连入场资格都拿不到。这次华泰证券的校招,就是一个非常典型的信号:提…...
C# WinForm 工作流设计器:拖拽连线与可视化流程图实现解析
C# WinForm 工作流设计 工作流程图拖拽设计 GDI 绘制工作流程图 大概功能说明一下:1.支持拖动绘制工作节点2.支持移动每个节点的移动3.支持直线连接节点4.支持节点移动连接线自动跟随5.支持高亮显示选中的节点连线6.支持能删除选中节点和连线7.支持选中节点能显示节…...
