从前有有座山,山里有座庙,庙里有个老和尚给小和尚们讲故事,讲的什么呀,讲的是,从前有有座山,山里有座庙,庙里有个老和尚给小和尚们讲故事,讲的什么呀?讲的是?......

递归:1、一个函数再内部调用了自己,这种写法就叫递归( recursion)。

   2、递归额层数 在pytohn 里是有限制

   3、写递归函数必须要有一个结束条件

例1:求阶乘 n= 7   7*6*5*4*3*2*1

 def func(n):
if n == 1:
return 1
return n*func(n-1) print(func(4)) #分解步骤
n = 4
def func(4):#4*6 = 24 func(3)*4
if 4 == 1:
return 1
return 4*func(3)#当N=4时,if 条件不成立,先执行了func(3)然后进入下一步了递的过程
n = 3
def func(3):
if 4 == 1:
return 1
return 3*func(2)#当N=3时,if 条件不成立,先执行了func(2)然后进入下一步了以此类推
#下面说了。fun(2) =2 又到上一部 3*2=6
n = 2
def func(2):
if 2 == 1:
return 1
return 2*func(1) #2*1 =2 又回归到上一步
n = 1
def func(1):
if 1 == 1:
return 1#当N=1时,妇fun(1) =1 又执行回归的过程

例2  用递归函数,找索引 lis = [2,3,4,6,7,9,12,16,19,21,25,35,43,57,66,84,88,92,94,99]

 # lis = [2,3,4,6,7,9,12,16,19,21,25,35,43,57,66,84,88,92,94,99]
#print(lis.index(57))13
# index = 0
# for i in lis:
# if i == 57:
# print(index)
# index += 1
#这种找法太慢,如果序列有100W个数字呢?
#所有使用2分算法 每次把列表分成一半来找
#思路1
# def search(num,lis):
# #先找中间的数字
# mid = len(lis)//2 #整除
# if lis[mid] > num :#如果中间的值大于要找的值
# lis = lis[0:mid]#那就从前面找值
# search(num,lis)#再去前面值得中间值因为lis已经改变
# elif lis[mid] <num :#如果中间的值小于要找的值
# lis = lis[mid+1:]#从后面找
# search(num,lis)#去后面值得中间值因为lis已经改变
# elif lis[mid] == num:
# return lis[mid]
#这个程序是错误的,因为你找的时候列表变小了。不是原来的列表了
#思路2
#你不能改变列表,你要改变索引的位置
lis = [2,3,4,6,7,9,12,16,19,21,25,35,43,57,66,84,88,92,94,99]
def search(num,lis,start = None,end=None):
start = start if start else 0#如果start没值使用0,有值使用传的值
end = end if end else len(lis)-1#如果end没值就计算,有值使用传的值
#先找中间的数字
mid = (end - start)//2 + start
#mid = (end-start) //2 这样不对,如果索引缩小后,值就不正确必须加前面的数字
if lis[mid] > num :#如果中间的值大于要找的值从左开始,
return search(num,lis,start,mid-1)#修改索引的位置从做开始从中间-1结束
elif lis[mid] < num :#如果中间的值小于要找的值从右开始,
return search(num,lis,mid+1,end)#中间开始,最后结束
elif lis[mid] == num:
return mid,lis[mid]
print(search(57,lis))
#此函数只有递的过程没有归的过程

递归

例3 三级菜单实例

 #三级菜单
menu = {'北京':{
'海淀':{
'永定路':{},
'香山街':{}
},
'朝阳区':{
'小红门':{},
'太阳宫':{},
'潘家园':{}
}
}
,'陕西':{
'西安':{
'临潼区':{
'兵马俑':{}
},
'碑林区':{
'大雁塔':{}
}
},
'宝鸡':{
'凤翔县':{
'长青镇':{}
},
'岐山县':{
'某某镇':{}
}
}
}
,'甘肃':{'兰州':{
'安宁区':{
'黄河':{}
},
'城关区':{
'乌金峡':{}
}
},
'天水':{
'秦州区':{
'县家路':{}
},
'麦积区':{
'麦积山':{}
}
} }}
def Three_Level_Menu(menu):
while True:#如果输入的菜单不存在,就让用户一直输入。
for name in menu:print(name)#显示第一级菜单
key = input('请输入名称,如果退出请输入‘Q/q,如果返回上一层请输入B/b',)
if key.lower() == 'b':break#只跳出了当前函数的循环,
elif key.lower() == 'q':#和 ret相互结合,直接退出整个函数()
return 'q'
elif key in menu:
# for key1 in menu[key]:print(key1)# 打印2级菜单
# key2 = input('请输入名称')
#有没有发现上面2行代码,和函数定义的第一行和第二行基本差不多一样?
#相同的数据类型嵌套在一起,是不是感觉可以用递归呢?是不是感觉进入一个轮回?
#那我们继续调用这个函数即可
ret = Three_Level_Menu(menu[key])#不能继续传入menu了,不然和原来的菜单一样了
if ret == 'q': return 'q'
Three_Level_Menu(menu)

三级菜单

Day 13 : 函数递归,的更多相关文章

  1. python 之 函数 面向过程 三元表达式 函数递归

    5.11 面向过程编程思想 核心是'过程'二字,过程即解决问题的步骤,即先干什么,再干什么........ 基于面向过程编写程序就好比在设计一条流水线,是一种机械式的思维方式. 总结优缺点: 优点:复 ...

  2. Learning-Python【14】:匿名函数与函数递归

    一.什么是匿名函数 匿名函数就是没有名字的函数,又叫lambda表达式.用于一些简单的需要用函数去解决的问题,特点是只能在定义时使用一次,且函数体只有一行 匿名函数的定义就相当于只产生一个变量的值,而 ...

  3. Python之路Python全局变量与局部变量、函数多层嵌套、函数递归

    Python之路Python全局变量与局部变量.函数多层嵌套.函数递归 一.局部变量与全局变量 1.在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量.全局变量作用域是整个程序,局 ...

  4. python基础-函数递归

    函数递归 概念:直接或间接地重复调用函数本身,是一种函数嵌套调用的表现形式. 直接调用:在函数内部,直接调用函数本身 def foo(): print("这是foo函数") foo ...

  5. python函数:匿名函数、函数递归与二分法、面向过程编程

    今天主要讲三大部分内容: 一.匿名函数二.函数递归与二分法三.面向过程编程 一.匿名函数: """ 1. 什么时匿名函数 def定义的是有名函数:特点是可以通过名字重复调 ...

  6. python基础-基础知识(包括:函数递归等知识)

    老男孩 Python 基础知识练习(三) 1.列举布尔值为 False 的值空,None,0, False, ", [], {}, () 2.写函数:根据范围获取其中 3 和 7 整除的所有 ...

  7. day14函数递归调用

    day14函数递归调用 1.装饰器叠加 def deco1(func1): def wrapper1(*args,**kwargs): print('=====>wrapper1 ') res1 ...

  8. c语言函数, 函数调用及函数递归

    1. 函数的定义: 返回值类型 函数名(形参列表) {函数体(函数的实现内容)}, 注意: 如果没有参数, 小括号也是必不可少的.  函数与函数之间可以嵌套调用(也就是在一个函数内部可以调用另外一个函 ...

  9. Python开发【第一篇】Python基础之函数递归

    函数递归 递归的本质: 就是一个函数调用另外一个函数. def d(): return '123' def c(): r = d() return r def b(): r = c() return ...

随机推荐

  1. NGINX配置之一:日志篇

    打开nginx.conf配置文件: vi /usr/local/nginx/conf/nginx.conf 日志部分内容: 日志生成的到Nginx根目录logs/access.log文件,默认使用“m ...

  2. MySql精简

    安装的是免安装版MySql 由于MySql是开源的,故下载的时候源码也会包含,如果单纯只是使用其功能,则可以将这些文件删除为MySql减肥 可以删除的文件有如下: 1.mysql-test 文件夹: ...

  3. C# 中如何输出双引号(转义字符的使用)

    实现效果: 输出这样的一个含有双引号的字符串 "hello" 方式一: 不用 @ 时转义      System.Console.WriteLine("\"he ...

  4. 机器学习技法笔记:Homework #7 Decision Tree&Random Forest相关习题

    原文地址:https://www.jianshu.com/p/7ff6fd6fc99f 问题描述 程序实现 13-15 # coding:utf-8 # decision_tree.py import ...

  5. HDU 6574 Rng

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6574 思路:用古典概型的方法计算俩个区间不想交的概率,再用 1 减去即可. 由于 枚举俩种括号的所有可 ...

  6. 净心诀---python3生成器

    生成器的作用----减少程序运行的内存开销 生成器特点: 1.一个一个的取值,而不是一次性把所有数据创建出来,迭代器中的数据不取不创建2.只能按照顺序取,不能跳过也不能回头3.一个迭代器中的数据只能从 ...

  7. WAMP中的mysql设置密码(默认密码为空)及phpmyadmin的配置

    来自:  http://wenku.baidu.com/link?url=J4K28e1kt-_ykJLsOtS1b5T6hKj5IzL5hXSKIiB133AvPCUXLlxGKScsBsxi0mA ...

  8. Ubuntu 常用软件记录【持续更新】

    主机之间通信 Shell 管理器: asbru-cm 文件传输工具: filezilla 虚拟化 Virtual box

  9. Spring入门(二)

    Spring IOC&DI 控制反转(inversion of control):控制什么?什么反转? 我们都知道,传统的程序中,如果A类需要使用B类对象,会在程序中直接创建B类对象实例,此时 ...

  10. Maven pom配置(Spring+SpringMvc+mybaties)

    <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven ...