Rust 练习册:探索向量与斐波那契数列

Rust语言的循环实现 本文围绕 Rust 语言中的循环实现进行了详细的探讨,介绍了loopwhile和for循环的基本用法、性能优化以及错误处理等内容。作为 Rust 的基础控制流结构,循环在实际编程中有着广泛的应用,无论是处理用户输入、遍历集合、还是进行复杂计算,循环结构都能够有效提升代码的可读性和性能。在学习 Rust 的过程中,理解和掌握循环的用法将为我们的编程提供重要的基础。希望阅读完本文后,读者能够在实际开发中灵活运用这些循环结构,解决各种问题,并在 Rust 编程的旅程中不断进步。 阅读详情

在 Rust 编程学习中,向量(Vector)是最常用且最重要的数据结构之一。今天我们将通过几个简单的练习来深入了解 Rust 中向量的创建、初始化和使用,同时探索经典的斐波那契数列。

向量:Rust 中的动态数组

向量(Vec)是 Rust 标准库中提供的动态数组类型。与传统数组不同,向量的大小可以在运行时动态变化,这使得它在实际编程中非常有用。

核心实现

/// Create an empty vector
pub fn create_empty() -> Vec<u8> {
    Vec::new()
}

/// Create a buffer of `count` zeroes.
///
/// Applications often use buffers when serializing data to send over the network.
pub fn create_buffer(count: usize) -> Vec<u8> {
    vec![0; count]
}

/// Create a vector containing the first five elements of the Fibonacci sequence.
///
/// Fibonacci's sequence is the list of numbers where the next number is a sum of the previous two.
/// Its first five elements are `1, 1, 2, 3, 5`.
pub fn fibonacci() -> Vec<u8> {
    vec![1, 1, 2, 3, 5]
}

代码深度解析

创建空向量

/// Create an empty vector
pub fn create_empty() -> Vec<u8> {
    Vec::new()
}

这是创建空向量最基本的方法。Vec::new() 返回一个容量为 0 的空向量。由于我们指定了返回类型为 Vec<u8>,编译器知道这是一个存储 u8 类型元素的向量。

创建零初始化缓冲区

/// Create a buffer of `count` zeroes.
pub fn create_buffer(count: usize) -> Vec<u8> {
    vec![0; count]
}

这里我们使用了 vec! 宏的重复语法 [value; count] 来创建包含 count 个 0 的向量。这种语法在需要初始化固定值数组时非常有用,比如:

  • 创建零初始化的缓冲区
  • 初始化具有默认值的数组
  • 创建测试数据

斐波那契数列

/// Create a vector containing the first five elements of the Fibonacci sequence.
pub fn fibonacci() -> Vec<u8> {
    vec![1, 1, 2, 3, 5]
}

斐波那契数列是一个经典的数学序列,其中每个数字是前两个数字的和。这里我们直接返回了前五个元素的硬编码值。

测试用例详解

use short_fibonacci::*;

#[test]
fn test_empty() {
    assert_eq!(create_empty(), Vec::new());
}

#[test]
fn test_buffer() {
    for n in 0..10 {
        let zeroized = create_buffer(n);
        assert_eq!(zeroized.len(), n);
        assert!(zeroized.iter().all(|&v| v == 0));
    }
}

#[test]
fn test_fibonacci() {
    let fibb = fibonacci();
    assert_eq!(fibb.len(), 5);
    for window in fibb.windows(3) {
        assert_eq!(window[0] + window[1], window[2]);
    }
}

测试用例验证了我们函数的正确性:

  • 空向量创建函数返回真正的空向量
  • 缓冲区创建函数返回指定长度的零向量
  • 斐波那契函数返回正确的序列(通过滑动窗口验证性质)

Rust 特性的体现

1. Vec::new() 与 vec! 宏

Vec::new()    // 创建空向量
vec![0; 10]   // 创建包含10个0的向量

Rust 提供了多种创建向量的方式,适应不同场景的需求。

2. 滑动窗口迭代器

for window in fibb.windows(3) {
    assert_eq!(window[0] + window[1], window[2]);
}

windows() 方法是向量的一个强大功能,它创建一个滑动窗口迭代器,可以方便地处理连续的元素序列。

3. 迭代器适配器

assert!(zeroized.iter().all(|&v| v == 0));

all() 是一个迭代器适配器,它检查所有元素是否满足给定条件。这里我们验证所有元素都是 0。

向量的更多用法

向量在实际应用中有丰富的用法:

基本操作

let mut vec = Vec::new();
vec.push(1);           // 添加元素
vec.pop();             // 移除最后一个元素
let third = vec[2];    // 索引访问
let len = vec.len();   // 获取长度

内存预分配

let mut vec = Vec::with_capacity(100);  // 预分配容量
vec.reserve(50);                        // 确保至少还有50个元素的空间

收集迭代器结果

let vec: Vec<i32> = (1..5).collect();  // 从迭代器创建向量

斐波那契数列的动态生成

虽然我们的练习中使用了硬编码,但在实际应用中,我们可能需要动态生成斐波那契数列:

pub fn fibonacci_dynamic(n: usize) -> Vec<u64> {
    if n == 0 {
        return vec![];
    }
    if n == 1 {
        return vec![1];
    }
    
    let mut fib = vec![1, 1];
    for i in 2..n {
        let next = fib[i-1] + fib[i-2];
        fib.push(next);
    }
    fib
}

实际应用场景

这些向量操作在实际开发中非常常见:

  1. 网络编程:创建数据包缓冲区
  2. 图像处理:存储像素数据
  3. 数据分析:处理数值序列
  4. 游戏开发:管理游戏对象列表
  5. 文件处理:读取和处理字节流

性能考虑

向量在性能方面有很多优化:

  1. 内存连续性:元素在内存中连续存储,缓存友好
  2. 动态扩容:自动扩容策略减少重新分配频率
  3. 零成本抽象:编译后的性能与手写 C 代码相当

扩展思考

向量可以与许多其他 Rust 特性结合使用:

// 使用枚举存储不同类型
enum Data {
    Int(i32),
    Float(f64),
    Text(String),
}
let mixed_data: Vec<Data> = vec![/* ... */];

// 使用结构体存储复杂数据
struct Point { x: f64, y: f64 }
let points: Vec<Point> = vec![/* ... */];

总结

通过这个简单的练习,我们学习了 Rust 中向量的基本用法:

  • Vec::new() 创建空向量
  • vec! 宏创建并初始化向量
  • 向量的基本属性和方法
  • 迭代器与向量的结合使用
  • 向量在实际应用中的重要性

向量是 Rust 中最基础也是最重要的数据结构之一。掌握好向量的使用,是学好 Rust 的关键一步。

在下一篇文章中,我们将继续探索 Rust 的更多强大功能!

12、在 Rust 中集成 Python 实现斐波那契数列计算及相关功能拓展 本文介绍了如何在 Rust 中集成 Python 来实现斐波那契数列计算模块,并拓展了命令行工具和适配器接口功能。通过 Rust 的高性能计算能力与 Python 的易用性相结合,实现了跨语言模块化开发。文章还探讨了适配器的优势、应用场景以及项目优化建议,为多语言混合编程提供了实践参考。 阅读详情

相关推荐

13、使用 pyO3 crate 构建 Rust 接口

本文详细介绍了如何使用 pyO3 crate 在 Rust 中构建接口,并与 Python 进行融合,实现高性能的斐波那契数列计算。内容涵盖 Rust 模块构建、命令行工具开发、Python 适配器设计与实现,并通过测试验证功能的正确性。文中还探讨了最佳实践与未来拓展方向,帮助开发者更好地掌握 Rust 与 Python 协作的技术。

flink9streamer的博客 62

Rust 练习册 120:探索向量与斐波那契数列

本文介绍了Rust中向量(Vec<T>)的基本使用方法,包括创建空向量、初始化零值缓冲区和生成斐波那契数列。通过代码示例展示了Vec::new()、vec!宏等核心操作,并解析了测试用例对功能的验证。文章还探讨了向量的动态扩容、内存连续性等特性,以及在实际应用中的常见场景,如网络编程和数据分析。最后指出掌握向量操作是学习Rust的关键基础,为后续探索更高级功能做准备。

少湖说 499

recurse_crackle_pop:Rust递归应用解析与实践

Rust是一种注重安全、并发与性能的系统编程语言,由Mozilla研究院开发。它解决了传统C/C++等语言中的内存安全问题,通过所有权模型、借用检查器和生命周期等机制来预防空指针解引用、数据竞争等常见错误。Rust的这些特性使得其在开发高性能应用,如操作系统、游戏引擎、Web服务等场景中非常有吸引力。递归在数学和计算机科学中有悠久的历史。在数学中,递归定义用于定义序列、集合和函数等。例如,著名的斐波那契数列就是通过递归方式定义的:每个数等于前两个数的和,并且初始两个数是0和1。graph TD;

weixin_35756624的博客 893

用Rust语言生成 n 阶斐波那契数列

【代码】用Rust语言生成 n 阶斐波那契数列。

weixin_51311741的博客 279

易智联LM401模块学习(一)——初识Lora

Lora

weixin_46046597的博客 1054

半导体功率器件IGBT工艺全流程

本文概述了功率器件IGBT(绝缘栅双极型晶体管)的关键制造流程。主要工艺包括:基板制备、离子注入(B+/P+/P+FS层)、绝缘膜形成与加工(CVD沉积及刻蚀)、沟槽刻蚀、电极形成(Emitter和Collector)等步骤。通过离子注入、化学气相沉积和物理气相沉积等半导体工艺,依次完成器件各功能层的构建,最终形成具备高功率特性的IGBT器件。该流程体现了功率半导体制造中典型的掺杂、薄膜沉积和图形化工艺技术。

750

三步跑通 Claude Code Hooks 全部 13 个事件,让 AI 每次动手都过规则关

每次让 Claude 改完代码,你都得手动再核一遍它动了哪些文件、检查跑没跑,漏一次就要返工。Claude Code Hooks 就是干这个的:把把关做成钩子——AI 动手前先拦危险操作,动手后自动跑检查,不用你盯着。 ## 它是什么:一段话讲清定位 这一节用三句话说明项目定位,帮你判断它适不适合你现在的项目。 Claude Code Hooks 是 Claude Code 的确定性控制点:

gitblog_00769的博客 426

抖音小游戏上架避坑指南:从软著申请到ICP备案全流程解析

本文详细解析了抖音小游戏上架前必须完成的软著申请和ICP备案全流程,提供了清晰的时间线规划与实操避坑指南。文章重点阐述了个人与企业备案的区别、材料准备要点以及平台审核常见问题,旨在帮助独立开发者和小团队高效、合规地完成游戏上架,避免在行政流程中延误项目。

weixin_29276847的博客 1558

sql语言编程学习_通过欧拉计划学习Rust编程语言

最近想学习Libra数字货币的MOVE语言,发现它是用Rust编写的,看来想准确理解MOVE的机制,还需要对Rust有深刻的理解,所以开始了Rust的快速入门学习。看了一下网上有关Rust的介绍,都说它的学习曲线相当陡峭,曾一度被其吓着,后来发现Rust借鉴了Haskell等函数式编程语言的优点,而我以前专门学习过Haskell,经过一段时间的入门学习,我现在已经喜欢上这门神奇的语言。入...

weixin_39614060的博客 176

Cadence导入tsmcN65GP PDK的完整流程与常见问题解析

本文详细介绍了Cadence导入tsmcN65GP PDK的完整流程,包括文件解压、目录结构解析、安装脚本运行及Cadence集成配置。重点解析了常见问题如文件路径错误、权限问题和工艺库显示不全的解决方案,并提供了实战技巧与优化建议,帮助用户高效完成PDK安装与配置。

weixin_29215391的博客 546

从NHANES到发表:如何用survey包完成符合CDC要求的统计分析(含完整R代码)

本文详细介绍了如何利用R语言的survey包,对美国国家健康与营养调查数据进行符合CDC要求的统计分析。文章重点解析了NHANES数据的复杂抽样设计、权重变量的正确选择与调整,并提供了从数据获取、清洗、构建调查设计对象到执行加权回归及生成发表级表格的完整R代码实战指南,帮助研究者避免常见错误,确保分析结果的准确性与可发表性。

weixin_29054245的博客 521

rust持续学习 声明宏

理解下来基本用法就是这个,匹配替换,但是还需要深入理解一下各种metavariable究竟怎么定义的。这有个需要注意的地方,$input只有ident,tt,lifetime可以传递出去。这个就是匹配括号里的内容多次并替换为后面的括号里的逻辑,然后把东西push进去vec。返回Recurrence 的那里,mem匹配多次inits得到0,1,next_val 求值那里ind,seq的类型要ident才能通过。学习记录,都是学自圣经,macrobook啥的。第二个例子,在第一个宏调用另外的宏,

webgpu 617

Raspberry Pi 4B 蓝牙串口(SPP)配置与使用

Linux、Android、Windows 等操作系统带有在引导期间启动的蓝牙守护进程/蓝牙服务。 对于与监视器连接并使用 GUI(如 GTK 等)运行的设备,只需多次单击即可轻松启用并连接到附近的设备。 但是在无头设备的情况下,我们必须依赖于需要在命令行上运行的不同命令。 这篇博客我们将讨论如何在无头树莓派上通过蓝牙设备连接附近。

视觉与物联智能 2745

Rust 入门实战指南:Learn X in Y Minutes 文档库 el/rust.md 深度解读

Rust 是由 Mozilla Research 开发的一门系统级编程语言,它在不引入垃圾回收器(GC)与运行时(runtime)的前提下,同时提供底层性能控制与高层安全保证。本文以 Learn X in Y Minutes 文档库的希腊语版 Rust 教程 [el/rust.md](https://link.gitcode.com/i/188e17e72e00a0cf6fad1c52d8a4a0

gitblog_00717的博客 720

YOLOv11改进策略【模型轻量化】| 替换轻量化骨干网络:ShuffleNet V1

本文记录的是基于ShuffleNet V1的YOLOv11轻量化改进方法研究。ShuffleNet利用和操作降低计算成本,克服了现有先进架构在极小网络中因 1×1 卷积计算成本高而效率低的问题。相比一些传统的网络架构,能更好地。本文配置了原论文中和四种模型,以满足不同的需求。

Limiiiing的博客 1228

【异常】Cursor 模型服务地域访问限制报错的完整排查与解决方案This model provider doesn‘t serve your region

其本质是:Cursor客户端依赖的上游大语言模型服务提供商,基于自身服务的合规运营范围,对客户端发起的请求进行了来源地域权限校验;当系统检测到请求的网络来源地域,不在该模型服务商官方授权提供服务的地域范围内时,会触发服务访问拦截策略,拒绝响应本次模型调用请求,最终在客户端抛出该报错。合规声明:本文所提供的所有方案,均仅用于技术问题排查与解决,请您在使用过程中严格遵守当地法律法规,以及对应软件与模型服务提供商的用户协议与合规要求。更多关于AI+教育领域的干货,可以关注我的微信公众号一时间获取哦~

奶爸的编程之路,也就一周冷个三天 1134

如何快速上手OpenZKP:从环境搭建到首个Stark证明生成

OpenZKP是一个纯Rust实现的零知识证明(Zero-Knowledge Proof)系统库,专注于提供高效、简洁的Stark协议实现。本文将帮助新手快速掌握OpenZKP的环境搭建方法,并通过实例演示如何生成第一个Stark证明,让你轻松踏入零知识证明的世界。 ## 📋 准备工作:环境搭建步骤 ### 安装Rust环境 OpenZKP基于Rust开发,首先需要安装Rust工具链。打开终

gitblog_00442的博客 865

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

通过欧拉计划学习Rust编程(第22~25题)

最近想学习Libra数字货币的MOVE语言,发现它是用Rust编写的,所以先补一下Rust的基础知识。学习了一段时间,发现Rust的学习曲线非常陡峭,不过仍有快速入门的办法。 学习任何一项技能最怕没有反馈,尤其是学英语、学编程的时候,一定要“用”,学习编程时有一个非常有用的网站,它就是“欧拉计划”,网址: https://projecteuler.net 这个网站提供了几百道由易到难的数...

weixin_30274627的博客 397

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

斐波那契大数计算:从溢出到2089位的工程实战

斐波那契数列是理解算法复杂度与大数运算的经典入口。其本质是线性递推关系,但计算过程暴露出时间复杂度(O(2ⁿ)递归 vs O(n)迭代 vs O(log n)矩阵快速幂)、数据表示边界(int64溢出、浮点精度丢失)和技术栈依赖(Python内置int背后的GMP库)三大核心问题。当n超过100,传统方法即失效;n=1000时需任意精度整数支持;n=10000(2089位)则全面考验内存管理、中间态控制与结果校验能力。本文聚焦真实开发场景,解析迭代法、记忆化、矩阵快速幂及Binet公式的适用边界与踩坑点,特

weixin_34116110的博客 302

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Rust进阶-part8-迭代器

文档介绍Rust迭代器:基于Iterator trait,核心是next方法与关联类型Item。含迭代器类型(iter、into_iter等)、消耗型方法和适配器,附斐波那契迭代器实现,强调需导入Iterator trait以确保正确识别。

weixin_43633620的博客 865

Rust语言的迭代器

在程序设计中,迭代器是一种访问集合元素的设计模式。它提供了一种方法来依次访问集合中的每个元素,而不需要暴露集合的内部结构。在Rust中,迭代器是实现了Iterator特质的类型。Iterator特质定义了一个必须实现的next方法,这个方法会返回集合中的下一个元素。每个迭代器都可以被认为是一个状态机,在每次调用next方法时,它会返回当前元素并更新内部状态,以便下一次调用时返回下一个元素。当没有更多元素时,next会返回None,表示迭代结束。除了使用内置的迭代器,我们还可以创建自己的迭代器。

2501_91314545的博客 817

Rust性能优势解析:内存管理、并发模型与编译器优化

现代编程语言的内存管理和并发模型直接影响系统性能。Rust通过所有权系统实现零开销内存管理,避免了垃圾回收(GC)的运行时成本,在编译期确保内存安全。其无runtime设计使程序更接近裸机性能,特别适合系统级编程和高并发场景。与Go的协程和Node.js的事件循环相比,Rust的原生线程模型提供真正的并行能力。借助LLVM后端的深度优化,Rust代码在计算密集型任务中通常比Go快2-10倍。这些特性使Rust成为高性能网络服务、嵌入式系统和安全关键应用的理想选择,同时保持与C++相当的性能而无常见的内存安全

weixin_30786657的博客 398

Dyon脚本语言:为Rust程序注入动态灵活性的安全沙盒

在软件工程中,脚本语言常被用于实现动态配置、插件系统和快速原型开发,以弥补静态编译型语言在迭代效率上的不足。其核心原理是通过解释执行或即时编译,在运行时动态加载和执行代码逻辑,从而实现业务规则的热更新和灵活调整。这一技术价值在于显著缩短开发反馈循环,提升系统可扩展性和可维护性。在游戏开发、工具链构建和业务规则引擎等应用场景中尤为关键。Dyon正是基于这一理念,专为嵌入Rust程序而设计的动态类型脚本语言。它通过在Rust的安全边界内创建一个受控的脚本环境,实现了与宿主程序的高效、安全互操作。Dyon支持动态

weixin_30882895的博客 297

AI基础设施重构:Rust与Mojo如何解决Python性能瓶颈

在高性能计算和机器学习领域,编程语言的选择直接影响系统性能与开发效率。动态类型语言在原型开发阶段具有显著优势,但其解释执行和全局解释器锁机制往往成为计算密集型任务的性能瓶颈。通过编译优化和静态类型检查,系统级语言能够在内存安全的前提下实现零成本抽象,从而大幅提升执行效率。这种技术演进在AI基础设施中尤为重要,模型训练与推理对延迟和吞吐量的严苛要求,驱动着底层计算引擎的重构。Rust以其所有权系统和无畏并发特性,为构建安全高效的系统组件提供了理想方案;而Mojo作为Python超集,通过渐进式类型和编译时元编

weixin_34007906的博客 392

【Rust-Python混合开发提速实战】:掌握高性能编程的黄金组合

auto-generated

LiteTrans的博客 1058

组网第63课:安全域划分——Trust/Untrust/DMZ、区域模型、与 VLAN 的关系

一组接口 + 一组策略 + 一条默认拒绝。一组接口:这个域包含哪些物理口、VLAN、子接口;一组策略:这个域到别的域放行什么、拒绝什么;一条默认拒绝:没写进策略的,一律不通。第三条最关键。没有默认拒绝,前面划的域全是装饰。

qq_36765170的博客 516
下一篇: Rust 练习册:Trait 中的同名函数调用
NetPilot2025
博客等级 码龄1年 0粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值