(小甲鱼python)函数笔记合集七 函数(IX)总结 python实现汉诺塔详解

news/2024/5/5 7:09:31/文章来源:https://blog.csdn.net/qq_44985415/article/details/129325298

一、基础复习

  1. 函数的基本用法 创建和调用函数 函数的形参与实参等等
  2. 函数的几种参数 位置参数、关键字参数、默认参数等
  3. 函数的收集参数*args **args 解包参数详解
  4. 函数中参数的作用域 局部作用域 全局作用域 global语句 嵌套函数 nonlocal语句等详解
  5. 函数的闭包(工厂函数)
  6. lambda()函数表达式、map()、filter()函数详解
  7. 生成器的定义、使用和产生生成器的两种方法详解
  8. 函数的递归、递归和迭代的区别详解

二、汉诺塔

1.汉诺塔简介

汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

在这里插入图片描述汉诺塔移动规则:

  • 规则一:一次只能移动一枚金片。
  • 小片必须在大片的上面。

2.汉诺塔代码编写
汉诺塔的代码编写,主要用到了函数的递归, 对递归不熟悉的可以看一下函数的递归、递归和迭代的区别详解
例1:当汉诺塔层数为5时

def hanoi(n,x,y,z):if n==1:print(x,'-->',z) # 如果只有1层,直接将金片从x移动到zelse:hanoi(n-1,x,z,y) # 将x上的n-1个金片移动到yprint(x,'-->',z) # 将最底下的金片从x移动到zhanoi(n-1,y,x,z) # 将y上的n-1个金片移动到zn=int(input('请输入汉诺塔的层数:'))
hanoi(n,'A','B','C') 

结果:

>>> 
================= RESTART: E:\xiaojiayu code\049讲:函数(IX).py =================
请输入汉诺塔的层数:5
A --> C
A --> C
B --> C
A --> C
B --> C
B --> C
A --> C
A --> C
B --> C
B --> C
A --> C
B --> C
A --> C
A --> C
B --> C
A --> C
B --> C
B --> C
A --> C
B --> C
A --> C
A --> C
B --> C
B --> C
A --> C
A --> C
B --> C
A --> C
B --> C
B --> C
A --> C

例2:当汉诺塔层数为3时
结果:

>>> 
================= RESTART: E:\xiaojiayu code\049讲:函数(IX).py =================
请输入汉诺塔的层数:3
A --> C
A --> C
B --> C
A --> C
B --> C
B --> C
A --> C
>>> 

汉诺塔n为3时,代码解释如下:
在这里插入图片描述

课后题:
1.给定一个整数 n,请编写一个递归函数,计算从 1 + 2 + 3 + … + n 的结果(比如 n = 10,那么结果就是 55)。
代码:

>>> def get_sum(n):
...     if n == 1:
...         return 1
...     else:
...         return n + get_sum(n-1)
...
>>> get_sum(10)
55
>>> get_sum(100)
5050

解析:如果是 n 等于 1 就返回 1(结束递归),否则就是返回 n + get_sum(n-1),递归其实很好理解的对吧~
2.给定一个整数 n,请编写一个递归函数,判断该整数是否为 2 的幂次方。如果是返回 True,否则返回 False。
代码:

>>> def isPowerOfTwo(n):
...     if n > 0:
...         if n == 1:
...             return True
...         if n % 2 == 1:
...             return False
...         return isPowerOfTwo(n/2)
...     else:
...         return False
...        
>>> isPowerOfTwo(1)
True
>>> isPowerOfTwo(0)
False
>>> isPowerOfTwo(8)
True

解析:if n % 2 == 1 这句虽然不要也可以,但是有它可以极大地提高代码的工作效率。
3.请实现一个递归函数,要求只使用加号运算符(+)来实现乘法运算的结果。
我的代码:

>>> def mul(x,y):if x<1:return 0else:return y+mul(x-1,y)
# 结果
>>> mul(3,4)
12
>>> mul(3,5)
15
>>> mul(12,24)
288

答案代码:

>>> def mul(x, y):
...     if x == 0 or y == 0:
...         return 0
...     if x == 1:
...         return y
...     if y == 1:
...         return x
...     if x < y:
...         return mul(x-1, y) + y
...     else:
...         return mul(x, y-1) + x
# 结果
>>> mul(3, 4)
12
>>> mul(3, 5)
15
>>> mul(12, 24)
288

4.给定一个列表 L,请编写一个递归函数,找到该列表中最大的元素。
代码:

>>> def get_max(L):
...     if len(L) == 2:
...         return L[0] if L[0] > L[1] else L[1]
...     else:
...         sub = get_max(L[1:])
...         return L[0] if L[0] > sub else sub

解析:如果长度为 2,直接比较列表仅剩的两个元素大小;否则通过 get_max(L[1:]) 每次递归减少 1 个元素(sub 表示从剩余的部分拿出最大的数)。
5.假设僧侣每秒钟都能正确地移动一枚金片,请问将 64 枚金片从一根银针移动到另外一根银针上,大概需要使用多少时间?
解析:可能你会想着拿课堂中汉诺塔的代码进行修改,然后试图让程序移动完再顺便告诉你总共移动了多少次,像下面这样:

i = 0
def hanoi(n, x, y, z):global iif n == 1:i += 1else:hanoi(n-1, x, z, y)i += 1hanoi(n-1, y, x, z)n = int(input('请输入汉诺塔的层数:'))
hanoi(n, 'A', 'B', 'C')
print(i)

但问题是如果输入的层数是 64 的话,代码执行的时间会相当相当久,以致于你可能等不到结果。
让我们先来看看汉诺塔的实现代码:

def hanoi(n, x, y, z):if n == 1:print(x, '-->', z)  # 如果只有 1 层,直接将金片从 x 移动到 zelse:hanoi(n-1, x, z, y) # 将 x 上的 n-1 个金片移动到 yprint(x, '-->', z)  # 将最底下的金片从 x 移动到 zhanoi(n-1, y, x, z) # 将 y 上的 n-1 个金片移动到 zn = int(input('请输入汉诺塔的层数:'))
hanoi(n, 'A', 'B', 'C')

递归调用和移动金片的规律是这样的:
g(n) = g(n-1) + 1 + g(n-1)
也就是:
g(n) = 2 * g(n-1) + 1
当 n == 1 的时候,g(1) == 1
那么我们就可以根据这条规律,写出如下代码:

>>> def g(n):
...     if n == 1:
...         return 1
...     else:
...         return 2 * g(n-1) + 1
>>> g(64)
18446744073709551615
>>> g(64) / 365 / 24 / 3600
584942417355.072

题目来自小甲鱼python函数(IX)

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

产品新人如何培养产品思维?

什么是产品思维&#xff1f;其实很难定义&#xff0c;不同人有不同的定义。有的人定义为以用户为中心打磨一个完美体验的产品&#xff1b;有的定义为从需求调研到需求上线各个步骤需要思考的点&#xff0c;等等。本文想讨论的产品思维是&#xff1a;怎么去发现问题&#xff0c;…

【JavaSE】逻辑控制语句

文章目录一. 顺序结构二. 分支结构1. if 语句2. switch 语句3、循环结构3.1 while 循环3.2 do while 循环3.3 for 循环3.4 break 和 continue三. 输入输出1. 输出到控制台2. 从键盘输入一. 顺序结构 顺序结构比较简单&#xff0c;即程序按照代码书写的顺序一行一行执行下去。 …

BS系统中的安全方案(SSO和Oauth2认证,数据加密)

摘要用户用浏览器打开网站&#xff0c;DNS会根据域名找到相应的服务器IP给到浏览器&#xff0c;仅接着用户的浏览器会与服务器建立连接&#xff0c;通过网路上的各个设备(交换机、路由器、基站、光纤等)&#xff0c;将服务器上的数据发送到用户的电脑上&#xff0c;在浏览器里呈…

函数式编程:Lambda 表达式

函数式编程&#xff1a;Lambda 表达式 每博一文案 曾经读过的依然令我感动的句子&#xff0c;生活总是不如意&#xff0c;但往往是在无数痛苦中&#xff0c;但往往是在无数痛苦中&#xff0c;在重重矛盾 和艰难中才能成熟起来&#xff0c;坚强起来&#xff0c;爱情啊&#xf…

EXCEL里的各种奇怪计算问题:数字后面自动多了 0.0001, 数字后面位数变成000,以及一些取整,数学函数

1 公式计算后的数&#xff0c;用只粘贴数值后&#xff0c;后面自动多了 0.0001&#xff0c;导致不再是整数的问题 问题入戏 见第1个8400&#xff0c;计算时就出现了问题&#xff0c;按正常&#xff0c;这里8400应该是整数&#xff0c;而不应该带小数&#xff0c;但是确实就计…

vmware虚拟机与树莓派4B安装ubuntu1804 + ros遇到的问题

如题所示&#xff0c;本人在虚拟机上安装ubuntu1804&#xff0c;可以很容易安装&#xff0c;并且更换系统apt源和ros源&#xff0c;然后安装ros&#xff0c;非常顺利&#xff0c;但是在树莓派4B上安装raspiberry系统就遇到了好多问题。 树莓派我烧录的是这个镜像&#xff1a;ub…

k8s-Kubernetes集群部署

文章目录前言一、Kubernetes简介与架构1.Kubernetes简介2.kubernetes设计架构二、Kubernetes集群部署1.集群环境初始化2.所有节点安装kubeadm3.拉取集群所需镜像3.集群初始化4.安装flannel网络插件5.扩容节点6.设置kubectl命令补齐前言 一、Kubernetes简介与架构 1.Kubernetes…

L - Let‘s Swap(哈希 + 规律)

2023河南省赛组队训练赛&#xff08;四&#xff09; - Virtual Judge (vjudge.net) 约瑟夫最近开发了一款名为Pandote的编辑软件&#xff0c;现在他正在测试&#xff0c;以确保它能正常工作&#xff0c;否则&#xff0c;他可能会被解雇!Joseph通过实现对Pandote上字符串的复制和…

断点调试(debug)

目录 F8案例 ​编辑 debug过程中报错 ​编辑用debug查看方法源码 一层一层查看 Arrays.sort()方法 F9 DebugExercise 介绍&#xff1a;断点调试是指在程序的某一行设置一个断电&#xff0c;调试时&#xff0c;程序运行到这一行就会停住&#xff0c;然后可以一步步往下调试…

项目实战典型案例17——环境混用来带的影响

环境混用来带的影响一&#xff1a;背景介绍背景出现的事故二&#xff1a;思路&方案环境混用的危害如何彻底避免环境混用的问题四&#xff1a;总结五&#xff1a;升华一&#xff1a;背景介绍 本篇博客是对对项目开发中出现的环境混用来带的影响进行的总结并进行的改进。目的…

JAVA后端部署项目三步走

1. JAVA部署项目三步走 1.1 查看 运行的端口 lsof -i:8804 &#xff08;8804 为端口&#xff09; 发现端口25111被监听 1.2 杀死进程,终止程序 pid 为进程号 kill -9 pid 1.3 后台运行jar包 nohup java -jar -Xms128M -Xmx256M -XX:MetaspaceSize128M -XX:MaxM…

基于半车悬架的轴距预瞄与轴间预瞄仿真对比

目录 前言 1. 半车悬架模型 2.轴距预瞄(单点预瞄)和轴间预瞄(两点预瞄)原理与仿真分析 2.1轴距预瞄(单点预瞄) 2.1.1预瞄原理 2.2.轴间预瞄(两点预瞄) 2.2.1预瞄原理 2.3仿真分析 3.总结 前言 对于悬架而言&#xff0c;四个车轮实际的输入信息是受到前后延时以及左右相…

Jetpack Compose 中的重组作用域和性能优化

只有读取可变状态的作用域才会被重组 这句话的意思是只有读取 mutableStateOf() 函数生成的状态值的那些 Composable 函数才会被重新执行。注意&#xff0c;这与 mutableStateOf() 函数在什么位置被定义没有关系。读取操作指的是对状态值的 get 操作。也就是取值的操作。 从一…

路由协议(OSPF、ISIS、BGP)实验配置

目录 OSPF基础实验 建立OSPF邻居 配置虚连接 配置接口的网络类型 配置特殊区域 配置路由选路 配置路由过滤 ISIS基础实验配置 配置ISIS邻居建立 配置认证 配置路由扩散 配置路由过滤 配置定时器 BGP基础实验配置 建立BGP对等体 建立IBGP对等体 建立EBGP对等体…

音频基础知识简述 esp-sr 上手指南

此篇博客先对音频基础知识进行简要叙述&#xff0c;然后帮助读者入门 esp-sr SDK。 1 音频的基本概念 1.1 声音的本质 声音的本质是波在介质中的传播现象&#xff0c;声波的本质是一种波&#xff0c;是一种物理量。 两者不一样&#xff0c;声音是一种抽象的&#xff0c;是声…

第二章Linux操作语法1

文章目录vi和vim常用的三种模式vi和vim快捷键Linux开机&#xff0c;重启用户管理用户信息查询管理who和whoami用户组信息查询管理用户和组的相关文件实用指令集合运行级别帮助指令manhelp文件管理类pwd命令ls命令cd命令mkdir命令rmdir命令rm命令touch命令cp指令mv指令文件查看类…

10.单点登录原理及JWT实现

单点登录原理及JWT实现 一、单点登录效果 首先我们看通过一个具体的案例来加深对单点登录的理解。案例地址&#xff1a;https://gitee.com/xuxueli0323/xxl-sso?_fromgitee_search 把案例代码直接导入到IDEA中 然后分别修改下server和samples中的配置信息 在host文件中配置 …

【Opencv项目实战】图像的像素值反转

文章目录一、项目思路二、算法详解2.1、获取图像信息2.2、新建模板2.3、图像通道顺序三、项目实战&#xff1a;彩图的像素值反转&#xff08;方法一&#xff09;四、项目实战&#xff1a;彩图的像素值反转&#xff08;方法二&#xff09;五、项目实战&#xff1a;彩图转换为灰图…

Spark Catalyst

Spark Catalyst逻辑计划逻辑计划解析逻辑计划优化Catalyst 规则优化过程物理计划Spark PlanJoinSelection生成 Physical PlanEnsureRequirementsSpark SQL 端到端的优化流程&#xff1a; Catalyst 优化器 : 包含逻辑优化/物理优化Tungsten : Spark SQL的优化过程 : 逻辑计划 …

pytorch安装的超级详细教程(没有之一)

一、发展历程 &#xff08;简单介绍&#xff09; (15年)caffe --> (16年)tensorflow1.x --> (17年)keras --> (18年)Tensorflow2.x --> (19年)pytorch。 面向gihub开源项目编程。 向下支持比较好&#xff0c;各个版本之间支持比较好&#xff0c;兼容性强。 版本…