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. [Android] 基于 Linux 命令行构建 Android 应用(二):命令行管理项目

    创建 Android 项目 在命令行创建 Android 项目需要用到 android 工具(该工具由 Android SDK 提供,位于 <sdk>/tools/ 目录下.).它能自动生 ...

  2. 从Elasticsearch来看分布式系统架构设计

    分布式系统类型多,涉及面非常广,不同类型的系统有不同的特点,批量计算和实时计算就差别非常大.这篇文章中,重点会讨论下分布式数据系统的设计,比如分布式存储系统,分布式搜索系统,分布式分析系统等. 我们先 ...

  3. Gradle 设置全局代理

    #systemProp.socks.proxyHost=127.0.0.1 #systemProp.socks.proxyPort=7077 #systemProp.https.proxyHost=1 ...

  4. 腾讯云极速配置NodeJS+LNMP运行环境

    版权声明:本文由吴逸翔原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/848754001487150669 来源:腾云阁 h ...

  5. java转换图片压缩生成webp格式

    http://blog.csdn.net/xu_san_duo/article/details/79085718

  6. ABP之事件总线(5)

    前面已经对Castle Windsor的基本使用进行了学习,有了这个基础,接下来我们将把我们的事件总线再次向ABP中定义的事件总线靠近.从源码中可以知道在ABP中定义了Dictionary,存放三种类 ...

  7. IDEA入门

    刚开始用IDEA会有很多不习惯 项目报错: Project build error: Non-resolvable parent POM for com.ks:my-springboot1:0.0.1 ...

  8. [No0000171]wpf 类层次结构Class Hierarchy

    1.DispatcherObject类表示具有相关联的对象分派器.调度程序处理要在特定线程上执行工作的请求队列.它能够在其关联的线程上调用方法. DispatcherObject是对象的基类,用于跟踪 ...

  9. TCP协议和TCP/IP(簇)

    TCP协议(传输层) 用于应用程序之间的通信. 连接的建立是经过三次握手,断开的时候四次挥手. TCP 包头很复杂,但是主要关注五个问题,顺序问题,丢包问题,连接维护,流量控制,拥塞控制 状态位例如: ...

  10. typeof(), __typeof(), __typeof__(), -isKindOfClass:的区别

    关于  typeof()和 __typeof()  和 __typeof__() ,Stack Overflow 有一段解释,大概意思是, __typeof() .__typeof__() 是C语言的 ...