Self-study Python Fish-C Note14 P50to51

news2024/9/22 17:36:13

函数 (part 4)

本节主要讲函数 递归

递归 (recursion)

递归就是函数调用自身的过程
示例1:

def fun1(i):
    if i > 0: 
        print('something')
        i-=1
        fun1(i)
fun1(5) # 这样就会打印五遍 'something'
something
something
something
something
something

要让递归正常工作,一定要有一个结束条件,并且每次调用都会向着这个结束条件去推进。比如上面的例子,加上一个 if 条件语句,让递归在恰当的时候进行回。归小心无限调用的死循环(可以使用 Ctrl + C 强制结束)
有这样一句话“天才程序员用递归,普通程序员用迭代”。接下来我们用几个例子来批判比较一下相同任务递归与迭代的区别:
示例2,求一个数的阶乘:
在数学中,正整数的阶乘(英语:factorial)是所有小于等于该数的正整数的积,记为 n! 例如5的阶乘表示为 5!,其值为120

# 使用迭代
def fact1(n):
    result = n
    for i in range(1,n):
        result*=i
    return result
print(fact1(5))
print(fact1(10))
print(fact1(1))
120
3628800
1
# 使用递归
def fact2(n):
    if n == 1:
        return 1
    else:
        return n*fact2(n-1)
print(fact2(5))
print(fact2(10))
print(fact2(1))  
# print(fact2(-1))  这个如果运行会进入无限循环,挂掉
120
3628800
1

以 fact2(5) 为例,代码中实际做的如下:

递归过程结果
fact2(5) = 5 * fact2(4)——> fact2(5) = 5 * 4 * 3 * 2 * 1
fact2(4) = 4 * fact2(3)——> fact2(4) = 4 * 3 * 2 * 1
fact2(3) = 3 * fact2(2)——> fact2(3) = 3 * 2 * 1
fact2(2) = 2 * fact2(1)——> fact2(2) = 2 * 1
fact2(1) = 1——> fact2(1) = 1

示例3,斐波那契数列:
斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称“兔子数列”,其数值为 1,1,2,3,5,8,13,21,34,55,89……这个数列从第3项开始 ,每一项都等于前两项之和。

# 迭代法
def fib1(n):
    a = 1
    b = 1
    c = 1
    while n > 2:
        c = a + b 
        a = b
        b = c
        n-=1
    return c
print(fib1(1))
print(fib1(2))
print(fib1(3))
print(fib1(4))
print(fib1(5))
print(fib1(6))
1
1
2
3
5
8
# 递归法
def fib2(n):
    if n==1 or n==2:
        return 1
    else:
        return fib2(n-1)+fib2(n-2)
print(fib2(1))
print(fib2(2))
print(fib2(3))
print(fib2(4))
print(fib2(5))
print(fib2(6))
1
1
2
3
5
8

此时:

调用代码过程结果
fib2(1)直接去到 return 11
fib2(2)直接去到 return 21
fib2(3)fib2(3)=fib2(2)+fib2(1)=22
fib2(4)fib2(4)=fib2(3)+fib2(2)=fib2(2)+fib2(1)+fib2(2)3
fib2(5)fib2(5)=fib2(4)+fib2(3)=fib2(3)+fib2(2)+fib2(2)+fib2(1)=fib2(2)+fib2(1)+2*fib2(2)+fib2(1)=55
fib2(6)8

如果我们使用递归计算第 120 个数 即 fib2(120), 我们会发现计算了很长时间依然无法计算出结果。反而,使用迭代 fib1(120) 结果计算的很快。这就体现了递归和迭代之间的效率问题。每一次调用递归函数,他并不会立刻返回,而是要等到最底层的那个函数返回,然后在一层一层往上走,这个过程是非常耗费资源的。

汉诺塔

有三根杆子A,B,C。A杆上有 N 个 (N>1) 穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至 C 杆:
(1) 每次只能移动一个圆盘;
(2) 大盘不能叠在小盘上面。
提示:可将圆盘临时置于 B 杆,也可将从 A 杆移出的圆盘重新移回 A 杆,但都必须遵循上述两条规则
在这里插入图片描述

def hanoi(n,x,y,z):
    if n==1:
        print(x,'-->',z) # 如果只有1层,直接将金片从 x 移动到 z
    else:
        hanoi(n-1,x,z,y) # 将 x 上的 n-1 个金片移动到 y
        print(x,'-->',z) # 将放在最下面的金片从 x 移动到 z
        hanoi(n-1,y,x,z) # 将 y 上的 n-1 个金片移动到 z

hanoi(5,'A','B','C')
A --> C
A --> B
C --> B
A --> C
B --> A
B --> C
A --> C
A --> B
C --> B
C --> A
B --> A
C --> B
A --> C
A --> B
C --> B
A --> C
B --> A
B --> C
A --> C
B --> A
C --> B
C --> A
B --> A
B --> C
A --> C
A --> B
C --> B
A --> C
B --> A
B --> C
A --> C

总结递归函数的执行逻辑:递归函数在调用的时候不会直接立刻的去返回,而是经过层层调用,直到遇到符合条件的时候再触发返回机制,接着再逐层的返回。注意,递归函数一定要有一个结束条件

附言:
题目:Self-study Python Fish-C Note-14 P50-P51
本文为自学B站上鱼C的python课程随手做的笔记。一些概念和例子我个人为更好的理解做了些查询和补充
因本人水平有限,如有任何问题,欢迎大家批评指正!
原视频链接:https://www.bilibili.com/video/BV1c4411e77t?p=8

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

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

相关文章

IDEA2024.2重磅发布,更新完有4G!

JetBrains 今天宣布了其 IDE 家族版本之 2024.2 更新,其亮点是新 UI 现在已是默认设置,并且对 AI Assistant (AI助手)进行了几项改进。 安装密道 新 UI 的设计更加简约,可以根据需要以视觉方式扩展复杂功能。值得开发…

Arduino学习笔记2——初步认识Arduino程序

Arduino使用的编程语言是C。 一、注释文字 我们可以在程序中插入注释文字来提示开发者代码的作用。在Arduino中,单行注释用的是两个斜杠,多行注释用的是对称的斜杠加星号: 二、函数 和C语言相同,可以看到在打开IDE自动打开的默…

高并发下的分布式缓存 | Cache-Aside缓存模式

Cache-aside 模式的缓存操作 Cache-aside 模式,也叫旁路缓存模式,是一种常见的缓存使用方式。在这个模式下,应用程序可能同时需要同缓存和数据库进行数据交互,而缓存和数据库之间是没有直接联系的。这意味着,应用程序…

Java数据结构 | 二叉树基础及基本操作

二叉树 一、树型结构1.1 树的概念1.2 关于树的一些常用概念(很重要!!!)1.3 树的表示形式1.4 树的应用 二、二叉树2.1 二叉树的概念2.2 两种特殊的二叉树2.3 二叉树的性质2.4 二叉树的存储2.5 二叉树的基本操作2.5.1 代…

【前端可视化】 大屏可视化项目二 scale适配方案 g6流程图 更复杂的图表

项目介绍 第二个大屏可视化,整个项目利用scale进行按比例适配。 图表更加复杂,涉及到图表的叠加,mark,地图,g6流程图的能等 始终保持比例适配(本项目方案),始终满屏适配(项目一). echarts绘制较为复杂图表&#xff0…

C++:string类(auto+范围for,typeid)

目录 前言 auto typeid 范围for 使用方法 string类的模拟实现 默认构造函数 拷贝构造函数 swap 赋值重载 析构函数 迭代器iterator begin和end c_str clear size capacity []运算符重载 push_back reserve append 运算符重载 insert erase find npos…

postgresql 宝塔 连接不上,prisma

不太熟悉pgsql; 配置搞了半天; 一直连不上远程数据库; 后台经过探索发现需要以下配置 1. 端口放行; 5422 (pgsql的端口) 2.编辑 pg_hba.conf 文件最后新增一条,这样可以外部使用postgres超级管理员账号 host all all 0.0.0.0/0 md5 3. pris…

数据结构复杂度

文章目录 一. 数据结构前言1.1 数据结构1.2 算法 二. 算法效率2.1 时间复杂度2.1.1 T(N)函数式2.1.2 大O的渐进表示法 一. 数据结构前言 1.1 数据结构 什么是数据结构呢?打开一个人的主页,有很多视频,这是数据(杂乱无章&#xf…

了解k8s架构,搭建k8s集群

kubernetes 概述 Kubernetes 集群图例 安装控制节点 安装网络插件 安装 calico 安装计算节点 2、node 安装 查看集群状态 kubectl get nodes # 验证容器工作状态 [rootmaster ~]# kubectl -n kube-system get pods

【学习笔记】:Maven初级

一、Maven简介 1、为什么需要maven Maven是一个依赖管理工具,解决如下问题: 项目依赖jar包多jar包来源、版本问题jar包导入问题jar包之间的依赖Maven是一个构建工具: 脱离IDE环境的项目构建操作,需要专门的工具2、Maven介绍 https://maven.apache.org/what-is-maven.htm…

代码随想录算法训练营第44天|LeetCode 1143.最长公共子序列、1035.不相交的线、53. 最大子序和、392.判断子序列

1. LeetCode 1143.最长公共子序列 题目链接:https://leetcode.cn/problems/longest-common-subsequence/description/ 文章链接:https://programmercarl.com/1143.最长公共子序列.html 视频链接:https://www.bilibili.com/video/BV1ye4y1L7CQ…

苹果离线打包机配置和打包

1、虚拟机安装 macOS虚拟机安装全过程(VMware)-腾讯云开发者社区-腾讯云 给 windows 虚拟机装个 mac 雪之梦 1、安装苹果镜像 去网上下载,打包机的镜像要和自己mac电脑上的保持一致。 同时打包机的用户名也需要和自己的mac保持一致。 2、…

云原生专题-k8s基础系列-k8s-namespaces详解

获取所有的pod实例: k8s中,命名空间(Namespace)提供一种机制,将同一集群中的资源划分为相互隔离的组。同一命名空间内的资源名称要唯一,命名空间是用来隔离资源的,不隔离网络。 https://kubern…

Kafka 实战使用、单机搭建、集群搭建、Kraft集群搭建

文章目录 实验环境单机服务启动停止服务简单收发消息其他消费模式理解Kakfa的消息传递机制 集群服务为什么要使用集群部署Zookeeper集群部署Kafka集群理解服务端的Topic、Partition和Broker总结 Kraft集群相关概念 实验环境 准备三台虚拟机 三台机器均预装CentOS7 操作系统。…

探索Transformer中的多头注意力机制:如何利用GPU并发

什么是多头注意力机制? 首先,什么是多头注意力机制?简单来说,它是Transformer模型的核心组件之一。它通过并行计算多个注意力头(attention heads),使模型能够从不同的表示子空间中捕捉不同的特…

Oracle服务器windows操作系统升级出现计算机名称改变导致数据库无法正常连接

1.数据库莫名奇妙无法正常连接,经排查是主机名称改变,导致oracle无法正常运行 如何查看ORACLE主机名称及路径:需要修改 listener 和 tnsnames的配置的主机名 2.修改tnsnames配置的主机名称,HOST主机名称 3.修改listener中的主机…

【案例36】Apache未指向新的openssl

客户发现apache报openssl相关漏洞,于是升级了操作系统的openssl组件。但再次漏扫发现相关版本依旧显示openssl的版本为:1.0.2k。怀疑升级的有问题。 问题分析 查看libssl.so.10指向的是/lib64.so.10 ldd mod_ssl.so libssl.so.10指向的是openssl1.0.2k…

【实际案例】服务器宕机情况分析及处理建议

了解银河麒麟操作系统更多全新产品,请点击访问麒麟软件产品专区:https://product.kylinos.cn 服务器环境以及配置 物理机/虚拟机/云/容器 物理机 外网/私有网络/无网络 私有网络 处理器: Kunpeng 920 内存: 4 TiB BIOS版…

【JVM基础18】——实践-Java内存泄漏排查思路?

目录 1- 引言:2- ⭐核心:2-1 排查思路2-2 步骤1:获取堆内存快照 dump2-3 步骤2、3:使用 VisualVM 打开 dump文件 3- 小结:3-1 Java内存泄漏排查思路? 1- 引言: 首先得明确哪里会产生内存泄漏的…

Solidworks API利用C# 实现物体的运动与碰撞检测

详情见github连接 SolidWorks-API-Collision-Detection Use SolidWorks API to MovePart and Collision Detection 利用solidworks的API来移动控件物体以及进行碰撞检测 visual studio 2022 利用Nuget 安装这些库 打开solidworks 可以看到有两个控件 部件运动 使用封装的函…