what's the 递归?

  递归函数的定义:在函数里可以再调用函数,如果这个调用的函数是函数本身,那么就形成了一个递归函数。

  递归的最大深度为997,这个是程序强制定义的,997完全可以满足一般情况下用到递归的情形。

#最大997层
def foo(n):
print(n)
n += 1
foo(n)
foo(1)

举个栗子:

  假设你想知道A的年龄,但你只知道A比B大2岁,B又比C大两岁,C又比D大两岁,D比E大两岁,恰好你知道E的岁数,那是不是就能知道A的岁数了呢,这就可以组成一个递归。那我们假设E的岁数是20

def age(n):
if n == 1:
return 20
else:
return age(n-1)+2 print(age(5))

递归小练习

def func1(x):
print(x)
func1(x-1) def func2(x):
if x>0:
print(x)
func2(x-1) def func3(x):
if x>0:
func3(x-1)
print(x) func1(5) #死循环
func2(5) #5 4 3 2 1
func3(5) #1 2 3 4 5

练习1

def test(n):
if n == 0:
print("我的小鲤鱼", end='')
else:
print("抱着", end='')
test(n-1)
print("的我", end='')
def func(n):
print('吓得我抱起了', end='')
test(n) func(3)#吓得我抱起了抱着抱着抱着我的小鲤鱼的我的我的我

练习2(吓得我抱起了抱着抱着抱着我的小鲤鱼的我的我的我)

二分算法

  递归函数的一个经典用法就是二分算法,二分算法的意思是用对半切查找的方式从由一群由小到大的数组成的列表中找到要找的数字的方法

举个栗子:

l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
#优化后的代码
def func(l,aim):    def func(l, aim,start = 0,end = len(l)-1 ):
mid = (len(l)-1)//2      mid = (start+end)//2
if l:    if not l[start:end+1]:
if aim > l[mid]:        return
func(l[mid+1:],aim)      elif aim > l[mid]:
elif aim < l[mid]:        return func(l,aim,mid+1,end)
func(l[:mid],aim)       elif aim < l[mid]:
elif aim == l[mid]:         return func(l,aim,start,mid-1)
print("bingo",mid)      elif aim == l[mid]:
else:    print("bingo")
print('找不到')    return mid
func(l,66)   index = func(l,68)
func(l,6)    print(index)

以上就是简单的二分算法,当然因为切片会造成内存的损耗,所以我们还可以将以上代码进行改进

def bin_search_rec(data_set,value,low,high):
if low <= high:
mid=(low+high) // 2
if data_set[mid] == value:
return mid
elif data_set[mid] > value:
return bin_search_rec(data_set,value,low,mid-1)
else:
return bin_search_rec(data_set,value,mid+1,high)
else:return None
l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
a=bin_search_rec(l,66,2,88) 
print(a)#

汉诺塔游戏

  汉诺塔游戏是法国数学家爱德华·卢卡斯编写的一个印度的古老传说:大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。 大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。 在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。 64根柱子移动完毕之日,就是世界毁灭之时。

  这个游戏可以用递归的思想解决,首先我们来捋一捋思路:

      两个盘子时:

      1. 把小圆盘从A移动到B
      2. 把大圆盘从A移动到C
      3. 把小圆盘从B移动到C

      n个盘子时:

      1. 把n-1个圆盘(除去最后一个以外的所有)从A经过C移动到B
      2. 把第n个圆盘(最后一个)从A移动到C
      3. 把n-1个小圆盘从B经过A移动到C

接下来我们来写代码

a=0
def hanoi(n,x,y,z):
global a
if n==1:
a+=1
print(x,'-->',z)
else:
hanoi(n-1,x,z,y)#将前n-1个盘子从x移动到y上
hanoi(1,x,y,z)#将最底下的最后一个盘子从x移动到z上
hanoi(n-1,y,x,z)#将y上的n-1个盘子移动到z上 n=int(input('请输入汉诺塔的层数:')) hanoi(n,'柱子A','柱子B','柱子C')
print('一共用了%s次'%a)
"""
假设我们的汉诺塔层数为3
请输入汉诺塔的层数:3
柱子A --> 柱子C
柱子A --> 柱子B
柱子C --> 柱子B
柱子A --> 柱子C
柱子B --> 柱子A
柱子B --> 柱子C
柱子A --> 柱子C
一共用了7次
"""

  汉诺塔移动次数的递推式:h(x)=2h(x-1)+1。h(64)=18446744073709551615 假设婆罗门每秒钟搬一个盘子,则总共需要5800亿年!所以世界是不会毁灭的哇咔咔~

what' the python之递归函数、二分算法与汉诺塔游戏的更多相关文章

  1. 1.python算法之汉诺塔

    代码如下: #!/usr/bin/env python # encoding: utf-8 """ @author: 侠之大者kamil @file: 汉诺塔.py @t ...

  2. 算法:汉诺塔问题(Tower of Brahma puzzle)

    一.算法背景 最早发明这个问题的人是法国数学家爱德华·卢卡斯.传说越南河内某间寺院有三根银棒(A, B, C),上串 64 个金盘. 寺院里的僧侣依照一个古老的预言,以上述规则移动这些盘子:预言说当这 ...

  3. [js - 算法可视化] 汉诺塔(Hanoi)演示程序

    前段时间偶然看到有个日本人很早之前写了js的多种排序程序,使用js+html实现的排序动画,效果非常好. 受此启发,我决定写几个js的算法动画,第一个就用汉诺塔. 演示地址:http://tut.ap ...

  4. 从汉诺塔游戏理解python递归函数

    汉诺塔游戏规则: 有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,现在把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方 图 ...

  5. 【Python笔记】2020年7月30日练习【汉诺塔游戏】

    学习教程:廖雪峰-Python教程-函数-递归函数 学习笔记: 实例代码如下: def move(n, a, b, c): if n == 1: print(a,'--->', c) else: ...

  6. Python 汉诺塔游戏

    #n 多少个盘子 def hanoi(n,x,y,z): : print(x,'→',z) else: hanoi(n-, x, z,y) #将前n-1个盘子从X移动到y上 print(x,'→',z ...

  7. 零基础入门学习Python(24)--递归:汉诺塔

    知识点 这节课主要讲解用递归的方法,实现汉诺塔的解答 对于游戏的玩法,我们可以简单分解为三个步骤: 1) 将前63个盘子从X移动到Y上. 2) 将最底下的第64个盘子从X移动到Z上. 3) 将Y上的6 ...

  8. Python算法_递归:汉诺塔

    游戏链接:https://zhangxiaoleiv.github.io/app/TowerOfHanoi/Hanoi.html 汉诺塔游戏算法: 1 def hanoi(n,x,y,z): 2 if ...

  9. 【学习】Python解决汉诺塔问题

    参考文章:http://www.cnblogs.com/dmego/p/5965835.html   一句话:学程序不是目的,理解就好:写代码也不是必然,省事最好:拿也好,查也好,解决问题就好!   ...

随机推荐

  1. [Unity3D] 05 - Access to DB or AWS

    可以选择连接本地服务器,或者云服务器. 参考源代码 : https://www.cnblogs.com/wuzhang/p/wuzhang20141202.html (1) 功能:点击一下按键,然后访 ...

  2. 05原型模式Prototype

    一.什么是原型模式 Prototype模式是一种对象创建型模式,它采 取复制原型对象的方法来创建对象的实例.使用 Prototype模式创建的实例,具有与原型一样的 数据. 二.原型模式的特点 1. ...

  3. java面试(2)--大数据相关

    第一部分.十道海量数据处理面试题 1.海量日志数据,提取出某日访问百度次数最多的那个IP. 首先是这一天,并且是访问百度的日志中的IP取出来,逐个写入到一个大文件中.注意到IP是32位的,最多有个2^ ...

  4. 7.11python多进程

    #!/usr/bin/env python #!--*--coding:utf-8 --*-- #!@Time :2018/7/11 19:27 #!@Author TrueNewBee import ...

  5. 一次项目实践中DBCP数据库连接池性能优化

    关于数据库连接池DBCP的关注源于刚刚结束的一轮测试,测试内容是衡量某Webserver服务创建用户接口的性能.这是一款典型的tomcat应用,使用的测试工具是Grinder.DBCP作为tomcat ...

  6. 用flock命令解决Linux计划任务重复执行

    在做计划任务的时候,可能由于某些问题,任务没有执行完成,导致任务重复的运行,解决这个问题,只需要一个flock命令就可以了. flock --helpflock (util-linux-ng 2.17 ...

  7. 对mysql数据库字符串类型的数字排序

    select * from user where  1=1 order by  salary*1 desc limit 0,5 or select * from user where  1=1 ord ...

  8. NFS使用autofs自动挂载

    NFS自动挂载设置在/etc/fstab和/etc/rc.local可能挂载不成功,假如是服务端NFS宕机还可能导致客户端无法启动,可以使用autofs实现自动挂载 安装autofs yum -y i ...

  9. SQL 2017 远程连接被拒绝

    1.防火墙端口 2.数据库要能帐号登录 可是还是不行 打开:SQL Server 2017 配置管理器->SQL Server 服务 ->SQLServer(你的实例名)-> 右键- ...

  10. React 60S倒计时

    React 60S倒计时 1.设置状态: 2.函数主体: 3.应用: 4..效果图: