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. 解决wireshark检测不到网卡的问题

    第一步 1.打开windows设备管理器. 2.查看-显示隐藏的设备 3.非即插即用驱动程序 4.NetGroup Packet Filter Driver 右键属性---驱动程序---启动类型,修改 ...

  2. 【代码审计】YzmCMS_PHP_v3.6 CSRF漏洞分析

      0x00 环境准备 YzmCMS官网:http://www.yzmcms.com/ 程序源码下载:http://pan.baidu.com/s/1pKA4u99 测试网站首页: 0x01 代码分析 ...

  3. include_once与require_once的区别

    ①作用及用法  可以减少代码的重复 include(_once)("文件的路径")与require(_once)("文件的路径") ②理解 说白了,就是用包含进 ...

  4. js 去掉花括号

    "asd {{name}} {{age}}".replace(/{{(.*?)}}/g,'$1'); // "asd name age" "asd { ...

  5. Chronic sleep loss cannot be cured that easily

    Chronic sleep loss cannot be cured that easily Sleeping in on Saturday after a few weeks of too litt ...

  6. DB2 rollforward 命令使用详解

    DB2 rollforward 命令使用详解 原文:https://www.ibm.com/developerworks/cn/data/library/techarticles/dm-1003wuc ...

  7. org.apache.jasper.JasperException:Unable to read TLD "META-INF/c-1_0-rt.tld" from JAR file jstl-1.2.jar

    前两天把项目从eclipse EE版搬到MyEclipse中了.配置好jdk,确定build path中没有报错后,在tomcat中运行.结果,报错: org.apache.jasper.Jasper ...

  8. 英语专业出身也要走向python

    这两年一直徘徊在学习python和放弃python的道路上不断的徘徊,今年终于没有在蹉跎下去,选择了开始新的自我挑战,零基础开始学习python. 作为一名英语专业毕业的文科生,学习编程还是相对有些困 ...

  9. 机器学习使用sklearn进行模型训练、预测和评价

    cross_val_score(model_name, x_samples, y_labels, cv=k) 作用:验证某个模型在某个训练集上的稳定性,输出k个预测精度. K折交叉验证(k-fold) ...

  10. The General Query Log Binary Log

    https://dev.mysql.com/doc/refman/8.0/en/binary-log.html https://dev.mysql.com/doc/refman/8.0/en/quer ...