当前位置: 首页 > news >正文

「Mac玩转仓颉内测版50」小学奥数篇13 - 动态规划入门

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


关键词
  • 小学奥数
  • 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] = 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 表示程序成功执行
}

代码详解
  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.png


小结

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


上一篇: 「Mac玩转仓颉内测版49」小学奥数篇12 - 图形变换与坐标计算
下一篇: 「Mac玩转仓颉内测版51」基础篇13 - 高阶函数与闭包

作者:SoraLuna
链接:https://www.nutpi.net/thread?topicId=399
來源:坚果派
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


相关文章:

「Mac玩转仓颉内测版50」小学奥数篇13 - 动态规划入门

本篇将通过 Python 和 Cangjie 双语介绍动态规划的基本概念&#xff0c;并解决一个经典问题&#xff1a;斐波那契数列。学生将学习如何使用动态规划优化递归计算&#xff0c;并掌握编程中的重要算法思想。 关键词 小学奥数Python Cangjie动态规划斐波那契数列 一、题目描述 …...

前端退出对话框也就是点击右上角的叉,显示灰色界面,已经解决

文章目录 遇到一个前端bug&#xff0c;点击生成邀请码 打开对话框 然后我再点击叉号&#xff0c;退出对话框&#xff0c;虽然退出了对话框&#xff0c;但是显示灰色界面。如下图&#xff1a; 导致界面就会失效&#xff0c;点击任何地方都没有反应。 发现是如下代码的问题&am…...

使div每次隐藏显示后都从顶部开始

<div ref"addmodel" > <!-- 这里内容很长&#xff0c;超出屏幕。。。 --> </div> methods:{ // 页面显示时滚动至顶部 scrollToTop() { const addmodel this.$refs.addmodel; if (addmodel) { addmodel.scrollTop 0; } }, } 在div每次显示或者…...

资源付费软件开发 资源付费系统源码 资源付费类型小程序APP

应用场景 资源付费软件广泛应用于多个领域&#xff0c;以下是其主要应用场景&#xff1a; 在线教育&#xff1a; 各类教育机构、名师通过资源付费软件提供课程、讲座等学习资源&#xff0c;为学生提供个性化的学习服务。用户可以通过软件学习专业知识、职业技能等&#xff0c…...

文件的读写

所涉及到的函数如下&#xff1a;<stdio.h> 函数介绍网站&#xff1a;cplusplus.com - The C Resources Network 读写文件之前要先打开文件&#xff0c;使用完要关闭文件归返空间&#xff1a; fopen 打开 fclose 关闭 返回的是FILE*型&#xff0c;第一个参数是文…...

城市大脑新型智慧城市数据中台建设方案

建设背景与现状 随着城市化进程的加速&#xff0c;城市数据呈现出爆炸式增长&#xff0c;但数据的整合、共享和利用却面临诸多挑战。信息孤岛、数据冗余、管理分散等问题日益突出&#xff0c;制约了智慧城市的发展。为了解决这些问题&#xff0c;构建城市大脑新型智慧城市数据…...

二三(Node2)、Node.js 模块化、package.json、npm 软件包管理器、nodemon、Express、同源、跨域、CORS

1. Node.js 模块化 1.1 CommonJS 标准 utils.js /*** 目标&#xff1a;基于 CommonJS 标准语法&#xff0c;封装属性和方法并导出*/ 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的消息乱序 二、解决方案方案一&#xff1a; 顺序消息Kafka1. Kafka 顺序消息的实现1.1 生产者&#xff1a;确保同一业务主键的消息发送到同一个分区1.2 消费者&#xff1a;顺序消费消息 2. Kafka 顺…...

【golang】匿名内部协程,值传递与参数传递

代码例子 下面代码的区别是直接调用循环变量&#xff0c;这里使用的就是这个变量的引用&#xff0c;而不是将参数的副本传递给协程执行 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 服务器&#xff08; IIS &#xff09; 4. Linux 服务器 【 CentOS 系统】 ( 跨平台部署使用 ) 5. Linux 服务器下的 Docker 容器&#xff08; Docker 部署使用&#xff09; …...

购物车案例--分模块存储数据,发送请求数据渲染,底部总计数量和价格

shift鼠标右键&#xff0c;打开powershell&#xff0c;新建项目 自定义 只有一个页面&#xff0c;不涉及路由&#xff0c;勾选vuex,css,babel 无需保存预设 回车项目开始创建 项目用vscode打开 将src里的内容全部清空 将第七天的课程准备代码复制粘贴到src中 刷新页面&…...

PCIe学习笔记

PCIE高速串行数据总线 当拿到一块板子 比如你要用到PCIE 首先要看这块板子的原理图 一般原理图写的是 PCI express 表示PCIE 以下是Netfpga为例下的PCIE插口元件原理图 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/01dc604fbdc847e8998a978c83c7b2eb.png 一般主…...

The Rise and Potential of Large Language ModelBased Agents:A Survey---讨论

讨论 论法学硕士研究与Agent研究的互利性 近年来&#xff0c;随着激光诱导金属化技术的发展&#xff0c;激光诱导金属化与化学剂交叉领域的研究取得了长足的进步&#xff0c;促进了这两个领域的发展。在此&#xff0c;我们期待着LLM研究和Agent研究相互提供的一些益处和发展机…...

C语言:const的用法

有时候我们希望定义这样一种变量&#xff0c;它的值不能被改变&#xff0c;在整个作用域中都保持固定。例如&#xff0c;用一个变量来表示班级的最大人数&#xff0c;或者表示缓冲区的大小。为了满足这一要求&#xff0c;可以使用 const 关键字对变量加以限定&#xff1a; con…...

Redis - 集合 Set 及代码实战

Set 类型 定义&#xff1a;类似 Java 中的 HashSet 类&#xff0c;key 是 set 的名字&#xff0c;value 是集合中的值特点 无序元素唯一查找速度快支持交集、并集、补集功能 常见命令 命令功能SADD key member …添加元素SREM key member …删除元素SCARD key获取元素个数SI…...

LabVIEW面向对象编程有什么特点?

LabVIEW面向对象编程&#xff08;OOP&#xff09;的特点主要体现在它如何结合传统面向对象编程&#xff08;OOP&#xff09;的理念与LabVIEW的图形化编程模式&#xff0c;提供灵活的抽象和模块化的功能。以下是LabVIEW面向对象编程的几个主要特点&#xff1a; ​ 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长连接&#xff1a;跟踪文件上传和任务进度 文章目录 使用Spring Boot实现SSE长连接&#xff1a;跟踪文件上传和任务进度什么是SSE&#xff1f;使用场景前端库选择安装event-source-polyfill1. 创建SSE连接2. 关闭SSE连接3. 结合Vue.js使用 使用Spring B…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

nnUNet V2修改网络——暴力替换网络为UNet++

更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...

MyBatis中关于缓存的理解

MyBatis缓存 MyBatis系统当中默认定义两级缓存&#xff1a;一级缓存、二级缓存 默认情况下&#xff0c;只有一级缓存开启&#xff08;sqlSession级别的缓存&#xff09;二级缓存需要手动开启配置&#xff0c;需要局域namespace级别的缓存 一级缓存&#xff08;本地缓存&#…...

uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)

UniApp 集成腾讯云 IM 富媒体消息全攻略&#xff08;地理位置/文件&#xff09; 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型&#xff0c;核心实现方式&#xff1a; 标准消息类型&#xff1a;直接使用 SDK 内置类型&#xff08;文件、图片等&#xff09;自…...