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

【python算法学习1】用递归和循环分别写下 fibonacci 斐波拉契数列,比较差异

问题: fibonacci 斐波拉契数列,用递归和循环的方法分别写,比较递归和循环的思路和写法的差别

最直接的思路,是写递归方法

循环方法的稍微有点绕,我觉得问题主要是出在,总结循环的通项公式更麻烦,难在数学上。

1 python写的递归如下

1.1 py代码

####------递归版fib--------------####
def fib1(x):if x==0:return 1if x==1:return 1else:return fib1(x-1)+fib1(x-2)print(fib1(5))
print()for i in range(6):print(fib1(i))
print()

1.2 总结写这个fibo数列的递归的难点

  • 最核心的,先要总结递归规律
  • 这个fibo的递归规律很简单,就是 f(x)=f(x-1)+f(x-2), 这个也是通项公式
  • fibo的这个规律狠清晰,不难

2 python写的循环版本

2.1 py代码,循环版本

####------循环版fib--------------####def fib2(x):sum1=1sum2=1for i in range(x):if i==0:sum=1if i==1:sum=1elif i>1:sum=sum1+sum2sum1=sum2 sum2=sum return sum   print(fib2(6))
print()

2.2 没解决的奇怪报错问题

2.2.1 报错的代码

####------循环版fib--------------####def fib2(x):sum1=1sum2=1for i in range(x):if i==0:sum=1if i==1:sum=1elif i>1:sum=sum1+sum2sum1=sum2 sum2=sum return sum   print(fib2(6))
print()for i in range(6):print(fib2(i))
print()

2.2.2 导致报错的代码:报错的部分由于下面这部分引起

开始我并没有发现

后面发现删除这段代码就不报错

for i in range(6):
    print(fib2(i))
print()

2.2.3 报错内容

UnboundLocalError: cannot access local variable 'sum' where it is not associ
报错解释:

UnboundLocalError 指的是在函数内部尝试访问一个还没有赋值的局部变量。在 Python 中,如果你在函数内部给一个变量赋值了,它就会被视为一个局部变量,除非明确地声明它是全局变量。如果你在赋值之前就尝试访问它,就会引发 UnboundLocalError。

报错原因可能是你在给变量 sum 赋值之前就尝试使用它,或者你的函数内部有一个 sum() 内置函数的调用,导致名称冲突。

2.2.4 暂时没有找到好的解决办法

3 关于 fibo的循环版本的详细说明

3.1 对循环版fibo数列的 详细打点说明版本,可以清晰看到过程

####------循环版fib,详细打点--------------####
def fib3(x):#sum=0  #为啥详细版的这里不设 sum=0 不报错呢?sum1=1sum2=1for i in range(x):print("for循环第", i+1 ,"轮开始")if i==0:sum=1if i==1:sum=1#sum3=sum1+sum2#sum4=sum3+sum2#sum5=sum4+sum3#从这些公式里抽象出循环的,变换规律,抽象出通用公式+(先)辅助的值变换公式elif i>1:   #直接用 esle居然不行,必须判断 elseif i>1print("sum1=",sum1)print("sum2=",sum2)sum=sum1+sum2print("sum=",sum)sum1=sum2  #和下面那句顺序不能反sum2=sum print("sum1=",sum1)print("sum2=",sum2)print("sum=",sum)print("for循环第", i+1 ,"轮结束")print()return sum   print(fib3(6))
print()

3.2 最核心的,先要从表面的 递推关系上找到 通项公式组

        if i==0:
             sum=1
        if i==1:
            sum=1
        sum3=sum1+sum2
        sum4=sum3+sum2
        sum5=sum4+sum3

  • 可以看到
  • S3=S2+S1
  • S4=S3+S2
  • ...
  • 通项公式 S(n) =  S(n-1)+ S(n-2)
  • 但是循环不能像递归那样调用 函数本身,那就要找到 通项公式里的循环规律
  • 除了S(n) =  S(n-1)+ S(n-2)
  • 仔细看
  • 还有S(n-1)=S(n)
  • 还有S(n-2)=S(n-1)

因此,联立这3个方程就可以了

  • S(n) =  S(n-1)+ S(n-2)
  • S(n-1)=S(n)
  • S(n-2)=S(n-1)

4 目的:总结  递归和循环思想的相同和区别

4.1 区别

  • 递归是在函数内部,调用函数自身( 函数定义内部,函数的代码block里引用自己的函数名)
  • 不用直接写循环,写调用函数自身,没有直接的for while等循环形式
  • 但是其实内部已经是循环逻辑了

  • 循环是,除了处理一些特殊情况外,找到通项公式,以便进行循环
  • 肯定有循环的形式如for while等
  • 有可能是几个 通项公式方程组,反正要组成合理的,循环体,镶嵌在前面的循环形式for/while等之内

    for i in range(x):
        if i==0:
            sum=1
        if i==1:
            sum=1
        elif i>1:
            sum=sum1+sum2
            sum1=sum2 
            sum2=sum 

4.2 相同

  • 本质都是循环逻辑
  • 都需要找出数列的通项公式,便于告诉计算机进行循环计算
  • 在fibo数列里,循环方式,找通项公式,更难

5 比较网上别人写的 fibo的 递归和 循环的代码

相关文章:

【python算法学习1】用递归和循环分别写下 fibonacci 斐波拉契数列,比较差异

问题: fibonacci 斐波拉契数列,用递归和循环的方法分别写,比较递归和循环的思路和写法的差别 最直接的思路,是写递归方法 循环方法的稍微有点绕,我觉得问题主要是出在,总结循环的通项公式更麻烦,难在数学…...

【邀请函】庭田科技邀您第五届中国国际复合材料科技大会

第五届中国国际复合材料科技大会暨第七届国际复合材料产业创新成果技术展示(ICIE7-新疆)将于7月25-27日在新疆乌鲁木齐-国际会展中心举行。上海庭田信息科技有限公司将携多款仿真模拟软件亮相本次大会,诚挚欢迎各位到场咨询了解! …...

win32:第一个窗口程序-应用程序入口点(part.6)

第一个窗口程序的最后一部分:应用程序入口函数wWinMain;这是Windows应用程序的主函数,负责初始化应用程序、注册窗口类、创建主窗口并进入消息循环处理消息。 int APIENTRY wWinMain(_In_ HINSTANCE hInstance,_In_opt_ HINSTANCE hPrevInst…...

c++ 多边形 xyz 数据 获取 中心点方法,线的中心点取中心值搞定 已解决

有需求需要对。多边形 获取中心点方法&#xff0c;绝大多数都是 puthon和java版本。立体几何学中的知识。 封装函数 point ##########::getCenterOfGravity(std::vector<point> polygon) {if (polygon.size() < 2)return point();auto Area [](point p0, point p1, p…...

ext_errno:拓展errno

类似于C库的errno机制&#xff0c;报告错误发生的原因以及所在的位置&#xff0c;通过查询来获取。...

【CUDA】 Trust基本特性介绍及性能分析

Trust简介 Thrust 是一个实现了众多基本并行算法的 C 模板库,类似于 C 的标准模板库(standard template library, STL)。该库自动包含在 CUDA 工具箱中。这是一个模板库,仅仅由一些头文件组成。在使用该库的某个功能时,包含需要的头文件即可。该库中的所有类型与函数都在命名空…...

颈肩肌筋膜炎中医治疗

颈肩肌筋膜炎&#xff0c;又称颈肩肌纤维织炎或肌肉风湿症&#xff0c;是一种涉及筋膜、肌肉、肌腱和韧带等软组织的无菌性炎症。以下将分别从症状和治疗两方面进行详细介绍。 一、颈肩肌筋膜炎的症状 颈肩肌筋膜炎的主要症状包括&#xff1a; 1、肩背部疼痛&#xff1a;患者…...

Java 通配符 在短信发送之中 通配符参数动态获取解决方案

目录 1、通配符应用场景 2、实现方案分析 2.1、可能针对不同模板中核定参数硬编码到程序之中写死 2.2、通配置模板之中动态获得对应的参数 3、通过正则表达式验证与替换参数${}参考示例 4、参考文章 1、通配符应用场景 我们在使用通配符场景&#xff0c;主要是应用于短信…...

Mybatis-Plus中LambdaQueryWrapper

基本用法 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; // 假设有一个 User 实体类 LambdaQueryWrapper<User> queryWrapper new LambdaQueryWrapper<>(); // 添加查询条件 queryWrapper.eq(User::getName, "John&quo…...

C++ 入门05:类和对象

往期回顾&#xff1a; C 入门02&#xff1a;控制结构和循环-CSDN博客C 入门03&#xff1a;函数与作用域-CSDN博客C 入门04&#xff1a;数组与字符串-CSDN博客 一、前言 在前面文章的学习中&#xff0c;我们了解了 C 的基本结构、变量、输入输出、控制结构、循环、函数、作用域…...

4G LTE教程

整体架构 物理层&#xff08;第 1 层&#xff09; 物理层通过空中接口传输来自 MAC 传输信道的所有信息。负责 RRC 层的链路自适应 (AMC)、功率控制、小区搜索&#xff08;用于初始同步和切换目的&#xff09;和其他测量&#xff08;LTE 系统内部和系统之间&#xff09;。 介…...

C++:哈希表

哈希表概念 哈希表可以简单理解为&#xff1a;把数据转化为数组的下标&#xff0c;然后用数组的下标对应的值来表示这个数据。如果我们想要搜索这个数据&#xff0c;直接计算出这个数据的下标&#xff0c;然后就可以直接访问数组对应的位置&#xff0c;所以可以用O(1)的复杂度…...

自己动手写一个滑动验证码组件(后端为Spring Boot项目)

近期参加的项目&#xff0c;主管丢给我一个任务&#xff0c;说要支持滑动验证码。我身为50岁的软件攻城狮&#xff0c;当时正背着双手&#xff0c;好像一个受训的保安似的&#xff0c;中规中矩地参加每日站会&#xff0c;心想滑动验证码在今时今日已经是标配了&#xff0c;司空…...

keepalive脑裂

keepalive脑裂 调度器的高可用 vip地址主备之间的切换&#xff0c;主在工作时&#xff0c;p地址只在主上&#xff0c;主停止工作&#xff0c;ip飘移到备服务器。 在主备的优先级不变的情况下&#xff0c;主恢复工作&#xff0c;vip会飘回到主服务器。 1、配优先级 2、配置…...

STM32Cubemx配置生成 Keil AC6支持代码

文章目录 一、前言二、AC 6配置2.1 ARM ComPiler 选择AC62.2 AC6 UTF-8的编译命令会报错 三、STM32Cubemx 配置3.1 找到stm32cubemx的模板位置3.2 替换文件内核文件3.3 修改 cmsis_os.c文件3.4 修改本地 四、编译对比 一、前言 使用keil ARM compiler V5的时候&#xff0c;编译…...

Perl基础入门指南:从零开始掌握Perl编程

Perl是一种功能强大且灵活的编程语言&#xff0c;广泛应用于系统管理、Web开发、网络编程和文本处理等领域。如果你是编程新手或者想学习一种新的编程语言&#xff0c;Perl是一个不错的选择。本文将带你了解Perl的基础知识&#xff0c;并通过简单的示例代码帮助你快速入门。 什…...

Mybatis SQL注解使用场景

MyBatis 提供了几种常用的注解&#xff0c;主要用于简化 XML 映射文件的编写&#xff0c;使得 SQL 查询和操作可以直接在 Java 接口中定义。下面列出了主要的注解以及它们在被调用时的写法示例&#xff1a; 1. Select Select 注解用于执行查询操作&#xff0c;并将查询结果映…...

Dataset for Stable Diffusion

1.Dataset for Stable Diffusion 笔记来源&#xff1a; 1.Flickr8k数据集处理 2.处理Flickr8k数据集 3.Github&#xff1a;pytorch-stable-diffusion 4.Flickr 8k Dataset 5.dataset_flickr8k.json 1.1 Dataset 采用Flicker8k数据集&#xff0c;该数据集有两个文件&#xff…...

近期matlab学习笔记,学习是一个记录,反复的过程

近期matlab学习笔记&#xff0c;学习是一个记录&#xff0c;反复的过程 matlab的mlx文件在运行的时候&#xff0c;不需要在文件夹路径下&#xff0c;也能运行&#xff0c;但是需要调用子函数时&#xff0c;就需要在文件所在路径下运行 那就先运行子函数&#xff0c;把路径换过来…...

Elasticsearch7.5.2 常用rest api与elasticsearch库

目录 一、rest api 1. 新建索引 2. 删除索引 3. 插入单条数据 4. 更新单条数据 5. 删除单条数据 6. 查询数据 二、python elasticsearch库 1. 新建索引 一、rest api 1. 新建索引 请求方式&#xff1a;PUT 请求URL&#xff1a;http://ip/&#xff08;your_index_nam…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...