【Godot4.3】自定义数列类NumList

概述

数列是一种特殊数组。之前写过等比、等差数列、斐波那契等数列的求取函数。今天就汇总到一起,并添加其他的一些数列,比如平方数、立方数、三角形数等。

这里我首先采用以前比较喜欢的静态函数库的写法,然后在其基础上改进为基于类继承的类型体系。

等差数列和等比数列的名称

等差数列被称为算术级数(Arithmetic Sequence),因为它们的每一项是相邻两项的算术平均数(Arithmetic mean)

等比数列被称为几何级数(Geometric Sequence),因为它们的每一项是相邻两项的几何平均数(Geometric mean)

a,b的算数平均数 x = a + b 2 x=\frac{a+b}{2} x=2a+b,等差数列 a n = a n + 1 + a n − 1 2 a_n=\frac{a_{n+1}+a_{n-1}}{2} an=2an+1+an1 ,所以等差数列又叫做算数级数。

a,b的几何平均数 x = a b x=\sqrt{ab} x=ab ,等比数列 a n = a n + 1 a n − 1 a_n=\sqrt{a_{n+1}a_{n-1}} an=an+1an1 ,所以等差数列又叫做几何级数。


在函数库和类中,我使用拼音dengbidengcha表示等比和等差数列,感觉比使用英文要更适合像我这样的“中国宝宝”体质。毕竟代码是拿来用的,让自己更容易理解更重要一些。


形数

通过观察几何图形(2D或3D)堆金字塔的形式,可以获得一类特殊数列,叫做形数

三角形数就是最简单的形数,它对应于台球或保龄球的摆法。

在这里插入图片描述

可以很容易的得出它的规律: a n = 1 + 2 + 3.. + n a_n = 1+2+3..+n an=1+2+3..+n,也就是前n项自然数之和。

在这里插入图片描述

也可以看做是 a n = n × ( n + 1 ) 2 a_n=\frac{n×(n+1)}{2} an=2n×(n+1)

平方数

a n = a 2 a_n=a^2 an=a2被称为平方数, 1 2 , 2 2 , 3 2 … n 2 1^2,2^2,3^2…n^2 12,22,32n2,也就是: 1 , 4 , 9 , 16 , 25 … 1,4,9,16,25… 1,4,9,16,25

观察每一项与前一项的差,就可以发现:后一项与前一项的差为 3 、 5 、 7 、 9 … 3、5、7、9… 3579,加上第一项1,就是奇数。

通过几何形式表示:

在这里插入图片描述

就可以发现一个规律:前n个奇数的和,等于 n 2 n^2 n2

四面体数

将之前三角形数扩展到三维,就是四面体数。

其规律是: 1 + 3 + 6 + 10 + 15... 1+3+6+10+15... 1+3+6+10+15...,也就是前n个三角形数之和。

在这里插入图片描述

函数库代码

# ========================================================
# 名称:NumList
# 类型:静态函数库
# 简介:提供求常见数列前n项的函数
# 作者:巽星石
# Godot版本:v4.2.2.stable.official [15073afe3]
# 创建时间:202492314:38:51
# 最后修改时间:202492315:11:10
# ========================================================
class_name NumList# 等比数列
# 返回前n项
static func dengbi(a1:int,bi:int,n:int) -> PackedInt32Array:var arr:PackedInt32Arrayarr.append(a1)        # 第一项for i in range(1,n):var an = arr[arr.size()-1]  # 上一项arr.append(an * bi)return arr# 等差数列
# 返回前n项
static func dengcha(a1:int,cha:int,n:int) -> PackedInt32Array:var arr:PackedInt32Arrayarr.append(a1)        # 第一项for i in range(1,n):var an = arr[arr.size()-1]  # 上一项arr.append(an + cha)return arr# 斐波那契数列
# 返回前n项
static func fbnq(n:int) -> PackedInt32Array:var arr:PackedInt32Arrayarr.append(1)        # 第一项for i in range(n-1):var an = arr[arr.size()-2] + arr[arr.size()-1] if i>0 else 1arr.append(an)return arr# 平方数
# 返回从start开始的n项
static func square(start:int,n:int) -> PackedInt32Array:var arr:PackedInt32Arrayfor i in range(n):var an = pow(start+i,2) arr.append(an)return arr# 立方数
# 返回从start开始的n项
static func cubic(start:int,n:int) -> PackedInt32Array:var arr:PackedInt32Arrayfor i in range(n):var an = pow(start+i,3) arr.append(an)return arr# 三角形数
# xn = n(n+1)/2
# 返回从start开始的n项
static func triangular_num(start:int,n:int) -> PackedInt32Array:var arr:PackedInt32Arrayfor i in range(n):var a = start+ivar an = (a * (a+1))/2arr.append(an)return arr

类型化改造

# ========================================================
# 名称:NumList
# 类型:类
# 简介:提供常见数列类型
# 作者:巽星石
# Godot版本:v4.3.stable.steam [77dcf97d8]
# 创建时间:202492314:38:51
# 最后修改时间:202492316:19:39
# ========================================================
class_name NumList# 获取第n项
func get_item(n:int):pass# 获取从start开始的count项
func get_items(start:int,count:int) -> PackedInt32Array:var arr:PackedInt32Arrayfor i in range(1,count+1):arr.append(get_item(start + i - 1))return arr# 获取从start开始的count项和
func get_sum(start:int,count:int) -> int:var sum:intfor i in range(1,count+1):sum += get_item(start + i - 1)return sum# =============================== 等比数列 ===============================
# # a_n = a_1 * bi^{n-1}
class dengbi extends NumList:var a1:int   # 第一项var bi:int   # 公比func _init(a1:int,bi:int) -> void:self.a1 = a1self.bi = bi# 获取第n项func get_item(n:int):return a1 * pow(bi,n-1)# =============================== 等差数列 ===============================
# a_n = a_1 + (n-1) * cha
class dengcha extends NumList:var a1:int   # 第一项var cha:int  # 公差func _init(a1:int,cha:int) -> void:self.a1 = a1self.cha = cha# 获取第n项func get_item(n:int):return a1 + (n-1) * cha# =============================== 斐波那契数列 ===============================
# n_1 = n_2 = 1
# x_n = x_{n-1} + x_{n-2}
class fbnq extends NumList:# 获取第n项func get_item(n:int):if n in [1,2]:return 1else:return get_item(n-1) + get_item(n-2)# =============================== 平方数数列 ===============================
# x_n = n^2
class square extends NumList:# 获取第n项func get_item(n:int):return pow(n,2) # =============================== 立方数数列 ===============================
# x_n = n^3
class cubic extends NumList:# 获取第n项func get_item(n:int):return pow(n,3) # =============================== 三角形数 ===============================
# x_n = n(n+1)/2
class triangular_num extends NumList:# 获取第n项func get_item(n:int):return (n * (n+1)) / 2

可以看到,用类继承的形式,扩充新的数列类型,基本上只需要设定自己的一两个参数,并重写get_item()方法就可以了。而求前N项以及前N项和这样的,根本不需要重写。

在这里插入图片描述

测试:

@tool
extends EditorScriptfunc _run():var numlist = NumList.dengbi.new(2,2)print(numlist.get_item(3))      # 第3print(numlist.get_items(3,6))   # 第3项开始的6print(numlist.get_sum(0,6))     # 前6项和

输出:

8
[8, 16, 32, 64, 128, 256]
64

等差数列:

var numlist = NumList.dengcha.new(2,2)

输出:

6
[2, 4, 6, 8, 10, 12]
42

斐波那契数列:

var numlist = NumList.fbnq.new()
2
[1, 1, 2, 3, 5, 8]
20

平方数:

var numlist = NumList.square.new()
9
[1, 4, 9, 16, 25, 36]
91

立方数:

var numlist = NumList.cubic.new()
27
[1, 8, 27, 64, 125, 216]
441

三角形数:

var numlist = NumList.triangular_num.new()
6
[1, 3, 6, 10, 15, 21]
56

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1543803.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

大数据毕业设计选题推荐-国潮男装微博评论数据分析系统-Hive-Hadoop-Spark

✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、PHP、.NET、Node.js、GO、微信小程序、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇…

[vulnhub] Jarbas-Jenkins

靶机链接 https://www.vulnhub.com/entry/jarbas-1,232/ 主机发现端口扫描 扫描网段存活主机,因为主机是我最后添加的,所以靶机地址是135的 nmap -sP 192.168.75.0/24 // Starting Nmap 7.93 ( https://nmap.org ) at 2024-09-21 14:03 CST Nmap scan…

Android中高级面试题笔记题理论知识大全(PDF免费下载)

Android中高级面试题笔记题理论知识大全(PDF免费下载) 基本上全覆盖了市面上中大厂的面试题,笔试题。而且持续更新。 而且现在市场行情非常不好,所以多学点,背点面试题,笔记题目总没有坏处,只有好处。想获取更多资料: …

手机上轻松解压并处理 JSON 文件

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,在手机上有着广泛的应用场景。 首先,在数据传输方面,许多移动应用程序通过网络请求与后端服务器进行交互,而服务器端的 API 接口通常使用 JS…

[Redis][持久化][上][RDB]详细讲解

目录 0.前言1.RDB0.是什么?1.触发机制2.流程说明3.RDB文件的处理4.RDB的优缺点 0.前言 Redis ⽀持 RDB 和 AOF 两种持久化机制,持久化功能有效地避免因进程退出造成数据丢失问题,当下次重启时利⽤之前持久化的⽂件即可实现数据恢复 RDB ->…

Qt/C++ 了解NTFS文件系统,解析MFT主文件表中的常驻属性与非常驻属性

系列文章目录 整个专栏系列是根据GitHub开源项目NTFS-File-Search获取分区所有文件/目录列表的思路。 具体的如下: Qt/C 了解NTFS文件系统,了解MFT(Master File Table)主文件表(一) 介绍NTFS文件系统,对比通过MFT(Master File Tab…

16、斑马设备的ppocer-4进行文字识别,和opencv-mobile中文显示

基本思想:手上有个斑马设备,是客户的,简单记录一下开发过程和工程项目,同时记录跟着android小哥学习了很多anroid的知识,转ppocr-4参考之前的ppocr-3转换即可,整个框架仍然使用c++ ncnn jni框架推理和现实,图像库使用opencv-mobile 一、首先转paddle-cor-4 到ncnn的框架…

Pointnet++改进59:全网首发MogaBlock(2024最新模块)|用于在纯基于卷积神经网络的模型中进行判别视觉表示学习,具有良好的复杂性和性能权衡

简介:1.该教程提供大量的首发改进的方式,降低上手难度,多种结构改进,助力寻找创新点!2.本篇文章对Pointnet++特征提取模块进行改进,加入MogaBlock,提升性能。3.专栏持续更新,紧随最新的研究内容。 目录 1.理论介绍 2.修改步骤 2.1 步骤一 2.2 步骤二 2.3 步骤三 1.…

pdf怎么删除空白页?分享5个删除pdf页面的方法(批量删除法)

pdf文件因其跨平台、格式稳定的特性,已成为我们工作、学习中不可或缺的一部分。那么在编辑pdf格式文档中,总会遇到一些难题,比如说pdf怎么删除空白页 pdf与word一样,具备了多种编辑功能,只不过是word倾向于编辑&#x…

gitlab集成CI/CD,shell方式部署

目录 1.首先安装好gitlab和gitlab-runner,这两个,看我以往的教程 2.注册新的 Runner 3. 步骤 3.1 Enter the GitLab instance URL (for example, https://gitlab.com/): 3.2 Enter the registration token: 3.3 Enter a description for the runner: 3…

Python模块和包:自定义模块和包③

文章目录 一、模块1.1 什么是模块1.2 创建模块1.3 导入模块1.4 模块的命名空间 二、包2.1 什么是包2.2 创建包2.3 导入包2.4 包的命名空间 三、综合详细例子3.1 项目结构3.2 模块代码student.pycourse.pymanager.py 3.3 主程序代码main.py 3.4 运行结果 四、总结 Python模块和包…

Java 中的运算符重载

在这篇文章中,我们将深入探讨 Java 中 Operator 重载的迷人世界。尽管 Java 本身不支持运算符重载,但我们将发现 Manifold 如何使用该功能扩展 Java。我们将探讨它的好处、局限性和用例,尤其是在科学和数学代码方面。 我们还将探索 Manifold …

高清8k电脑壁纸分享

Hello!欢迎各位新老朋友来看小弟博客,祝大家事业顺利,财源广进!! 主题:高清壁纸分享 文件太大上传不上去😅😅😅😅😅,需要的朋友自取&…

国货美妆品牌整合营销多少钱?

合作咨询联系竑图 hongtu201988 化妆品品牌线上推广费用到底高不高,需要多少钱,是每个经营者最为关注的问题。结合中小美妆品牌在网络上的费用投入,有一个大致的范围:几千元到几十万不等/年!品牌越大,投入越…

什么鬼?主备同步正常,备库查询表空间使用结果却是空的?

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等) 公众号:老苏畅谈运维 欢迎关注本人公众号,更多精彩与您分享…

Centos Stream 9根目录扩容

要将 sda 的剩余空间扩展给 cs-root,可以按照以下步骤进行操作。假设你已经有剩余的未分配空间在 sda 上。 步骤 1:查看当前磁盘分区情况 首先,确保你有未分配的空间在 sda 上。 lsblk步骤 2:创建新的分区 使用 fdisk 或 par…

C++vector类的模拟实现

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 模拟实现vector类 收录于专栏【C语法基础】 本专栏旨在分享学习C的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 前置说明 1. vecto…

数据结构2——单链表

目录 1.链表 1.1链表的概念及结构 1.2 链表的分类 ​编辑2.无头单链表的实现 1. 节点 2.遍历链表 3.动态增加新节点 4.查找(修改) 5.插入 5.1 尾插 5.2 头插 5.3 在pos之前插入x 5.4 在pos之后插入x 6.删除 6.1 尾删 6.2 头删 6.3 删除…

YOLOv10改进,YOLOv10损失函数更换为Powerful-IoU(2024年最新IOU),助力高效涨点

改进前训练结果: 改进后的结果: 摘要 边界框回归(BBR)是目标检测中的核心任务之一,BBR损失函数显著影响其性能。然而,观察到现有基于IoU的损失函数存在不合理的惩罚因子,导致回归过程中锚框扩展,并显著减缓收敛速度。为了解决这个问题,深入分析了锚框扩展的原因。针…

狂神说多线程01

线程实现(重点) 多线程三个方法 继承Thread类 ⭐️实现Runnable 实现callable(了解) 线程状态 出生-? 线程同步(重点) (多个线程操作同一个对象,那个对象出现了不安…