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

news2024/11/16 2:02:07

概述

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

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

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

等差数列被称为算术级数(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:PackedInt32Array
	arr.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:PackedInt32Array
	arr.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:PackedInt32Array
	arr.append(1)        # 第一项
	for i in range(n-1):
		var an = arr[arr.size()-2] + arr[arr.size()-1] if i>0 else 1
		arr.append(an)
	return arr
	
# 平方数
# 返回从start开始的n项
static func square(start:int,n:int) -> PackedInt32Array:
	var arr:PackedInt32Array
	for 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:PackedInt32Array
	for 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:PackedInt32Array
	for i in range(n):
		var a = start+i
		var an = (a * (a+1))/2
		arr.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:PackedInt32Array
	for 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:int
	for 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 = a1
		self.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 = a1
		self.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 1
		else:
			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 EditorScript

func _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.coloradmin.cn/o/2160020.html

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

相关文章

基于飞腾平台的OpenCV的编译与安装

【写在前面】 飞腾开发者平台是基于飞腾自身强大的技术基础和开放能力,聚合行业内优秀资源而打造的。该平台覆盖了操作系统、算法、数据库、安全、平台工具、虚拟化、存储、网络、固件等多个前沿技术领域,包含了应用使能套件、软件仓库、软件支持、软件适…

ChatGPT 推出“Auto”自动模式:智能匹配你的需求

OpenAI 最近为 ChatGPT 带来了一项新功能——“Auto”自动模式,这一更新让所有用户无论使用哪种设备都能享受到更加个性化的体验。简单来说,当你选择 Auto 模式后,ChatGPT 会根据你输入的提示词复杂程度,自动为你挑选最适合的AI模…

解密 Python 的 staticmethod 函数:静态方法的全面解析!

更多Python学习内容:ipengtao.com 在 Python 中,staticmethod 函数是一种装饰器,用于将函数转换为静态方法。静态方法与实例方法和类方法不同,它们不需要类实例作为第一个参数,也不需要类作为第一个参数,因…

只用几行代码,不依赖任何框架?SMTFlow 轻松实现前端流程图

只用几行代码,不依赖任何框架?SMTFlow 轻松实现前端流程图! 在前端开发中,如果你需要一个简单好用的流程图设计工具,SMTFlow 绝对是你的不二之选!本文将介绍 SMTFlow 的核心功能、特点以及如何快速上手。 工…

C++中set和map的使用

1.关联式容器 序列式容器里存储的是元素本身&#xff0c;如vector、list、deque 关联式容器即&#xff0c;容器中存储<key&#xff0c;value>的键值对&#xff0c;树型结 构的关联式容器主要有四种&#xff1a;map、set、multimap、multiset。他们都使用平衡搜索树(即红…

项目实战:lngress搭建Nginx+WP论坛+MariaDB

1. 网站架构 本次部署形式完全舍弃 Docker&#xff0c;将所有应用都置于Kubernetes&#xff0c;采用 Deployment 而非单 Pod 部署&#xff0c;稳定性得到升级。 2. 部署 MariaDB [rootk8s-master ~]# mkdir tdr [rootk8s-master ~]# cd tdr/ &#xff08;1&#xff09;定义 …

Flowable7.0.1框架严重bug,流程跳转到指定节点导致流程中断

一、Bug描述 使用7.0.1版本的 moveActivityIdsToSingleActivityId 或 moveExecutionsToSingleActivityId实现节点跳转&#xff0c;程序不会报错&#xff0c;但是act_ru_task 没有生成新的任务&#xff0c;导致流程中断&#xff0c;这是相当严重的bug。 经过多次测试&#xff…

【LLM多模态】文生视频综述From Sora What We Can See: A Survey of Text-to-Video Generation

note 现在很多主流的文生视频应该还是Diffusion-based 基于扩散模型的方法这篇综述将现有研究按照三个维度进行分类&#xff1a;进化生成器&#xff08;Evolutionary Generators&#xff09;、卓越追求&#xff08;Excellent Pursuit&#xff09;、现实全景&#xff08;Realis…

LeetCode讲解篇之75. 颜色分类

文章目录 题目描述题解思路题解代码 题目描述 题解思路 我们可以将最终结果看成连续的三个区间&#xff0c;第一个区间内全是0&#xff0c;第二个区间内全是1&#xff0c;第三个区间内全是2 &#xff0c;其中这三个区间的长度都可以为0 我们可以将不断扩张 我们记录0区间的右…

滴滴开源项目分享来啦~

活动&#xff1a;参与开源项目&#xff0c;获得精美礼品 活动时间&#xff1a;2024年09月23-2024年10月23 活动详情请查看&#xff1a; ❤️&#x1f31f; Who is using XIAOJUSURVEY&#xff1f; Issue #64 didi/xiaoju-survey GitHub 活动奖品&#xff1a; ​ 不管你是…

基于单片机多点无线温度监控系统设计

本设计STC89C52RC单片机作为主控芯片&#xff0c;能够远程监控多个位置的温度变化。使用一个主机来接收和监控三个从机收集到的温度信息&#xff0c;利用DS18B20温度传感器采集温度信息&#xff0c;采用GL24S无线通讯模块将数据传输给主机进行接收&#xff0c;信息显示在主机连…

DesignMode__unity__抽象工厂模式在unity中的应用、用单例模式进行资源加载

目录 抽象工厂模式 思维导图 接口&#xff08;抽象类&#xff09; 工厂接口 抽象产品类 抽象武器接口 抽象人物接口 具体工厂和具体产品 具体工厂 &#xff08;1&#xff09;产品接口&#xff0c;生成具体人物 &#xff08;2&#xff09;武器接口&#xff0c;生成具体…

搜索引擎onesearch3实现解释和升级到Elasticsearch v8系列(五)-聚合

聚合 聚合基于Query结果的统计&#xff0c;执行过程是搜索的一部分&#xff0c;Onesearch支持0代码构建聚合&#xff0c;聚合目前完全在引擎层 0代码聚合 上图是聚合的配置&#xff0c;包括2个pdm文档聚合统计 termsOfExt term桶聚合&#xff0c;统计ext&#xff0c;如&…

JavaWeb——前端工程化(3/3):Vue项目开发流程(index.html、main.js和根组件之间的联系)

Vue项目开发流程 上篇我们介绍了工程化的 Vue 项目&#xff0c;将 Vue 项目启动起来并访问到了首页面。接下来&#xff0c;我们来分析如何访问到 Vue 项目的首页面&#xff0c;也就是 Vue 项目的开发流程。 现在访问的页面是 Vue 项目默认的首页 index.html&#xff0c;它是在…

Linux系统安装Julia语言并在VS Code中进行配置

Julia是一种专为科学计算而生的高级编程语言&#xff0c;具有开源、多平台、高性能的特点。Julia结合了动态语言的易用性与编译语言的速度&#xff0c;部分归功于其基于LLVM的JIT编译器&#xff0c;能够生成高效的本地代码。这使得Julia在许多情况下能够拥有与编译型语言&#…

56 mysql 用户权限相关的实现

前言 这里讨论 mysql 的权限相关处理 使用如下语句创建 tz_test 用户, 并赋予他 test_02 数据库的查询权限 create user tz_test% identified by tz_test; grant select on test_02.* to tz_test%; 查询目标数据表, 数据如下, tz_test_02 UPDATE command denied to user …

Centos 8安装VNC及多用户配置详细教程

Centos 8安装VNC及多用户配置详细教程 参考一、安装前准备二、安装三、创建新用户和设置VNC密码四、创建VNC系统服务文件五、多用户映射和配置VNC六、客户端用VNC Viewer登录 参考 1、参考1&#xff1a; VNC安装英文说明&#xff08;英文说明有误且仅适合单用户&#xff09;&a…

乌克兰因安全风险首次禁用Telegram

据BleepingComputer消息&#xff0c;乌克兰国家网络安全协调中心 &#xff08;NCCC&#xff09; 以国家安全为由&#xff0c;已下令限制在政府机构、军事单位和关键基础设施内使用 Telegram 消息应用程序。 这一消息通过NCCC的官方 Facebook 账号对外发布&#xff0c;在公告中乌…

java并发之并发理论

并发理论 Java 内存模型 Java 内存模型&#xff08;即 Java Memory Model&#xff0c;简称 JMM&#xff09;试图屏蔽各种硬件和操作系统的内存访问差异&#xff0c;以实现让 Java 程序在各种平台下都能达到一致的内存访问效果。 本身是一种抽象的概念&#xff0c;并不真实存在&…

【第十二章:Sentosa_DSML社区版-机器学习之回归】

目录 12.1 线性回归 12.2 决策树回归 12.3 梯度提升决策树回归 12.4 保序回归 12.5 XGBoost回归 12.6 随机森林回归 12.7 广义线性回归 12.8 LightGBM回归 12.9 因子分解机回归 12.10 AdaBoost回归 12.11 KNN回归 12.12 高斯过程回归 12.13 多层感知机回归 【第十…