目录

  • 什么是递归
  • 递归例题
  • 递归函数与二分查找算法
  • 相关练习题

1,什么是递归

  • 递归的定义:在一个函数里再调用这个函数本身
  • 递归的最大深度默认是:997 - - 是python从内存角度出发做的限制
  • 递归的缺点: 占内存
  • 递归的优点: 会让代码变简单

1.1 测试递归最大深度

n = 0
def recursion():global nn += 1print(n)recursion()recursion()# 结果呈现
1
2
...
995
996
Traceback (most recent call last):File "C:/Users/thinkpad/Envs/daily_test/test_project/递归函数.py", line 27, in <module>recursion()File "C:/Users/thinkpad/Envs/daily_test/test_project/递归函数.py", line 25, in recursionrecursion()File "C:/Users/thinkpad/Envs/daily_test/test_project/递归函数.py", line 25, in recursionrecursion()File "C:/Users/thinkpad/Envs/daily_test/test_project/递归函数.py", line 25, in recursionrecursion()[Previous line repeated 992 more times]File "C:/Users/thinkpad/Envs/daily_test/test_project/递归函数.py", line 24, in recursionprint(n)
RecursionError: maximum recursion depth exceeded while calling a Python object
RecursionError: maximum recursion depth exceeded while calling a Python object
递归的错误:超过的递归的最大深度

1.2 修改递归最大深度

import sys
sys.setrecursionlimit(100000)n = 0
def recursion():global nn += 1print(n)recursion()recursion()# 结果呈现
1
2
...
3924
3925

2,递归例题

2.1 A 比 B 大两岁,B 比 C 大两岁,C 比 D 大两岁,D 比 F 大两岁,F 18岁了,求A多大了?

  • 分析规律
age(A) = age(B) + 2
age(B) = age(C) + 2
age(C) = age(D) + 2
age(D) = age(F) + 2
age(F) = 18
  • 函数如下
def age(n):if n == 5:return 18elif n > 0 and n < 5:return age(n+1) +2print(age(1))# 或
def age(n):if n == 1:return 18else:return age(n-1)+2print(age(5))# 结果呈现
26

3,递归函数与二分查找算法

3.1 例题

  • 如果有这样一个列表,让你从这个列表中找到66的位置,你要怎么做?
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]
print(l.index(66))# 结果呈现
17
  • 不用 index,如何查找
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]
i = 0
for num in l:if num == 66:print(i)i+=1# 结果呈现
17

3.2 二分查找算法

  • 二分查找算法,必须处理有序的列表

3.2.1 有一个列表,从这个列表中找到66的位置

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]

通过 index 方法获取

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]
print(l.index(66))# 结果呈现
17

通过 for 循环获取

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]i = 0
for num in l:if num == 66:print(i)i+=1# 结果呈现
17

通过 二分查找算法 获取

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 find(l, aim, start = 0, end=None):end = len(l) if end is None else endmid_index = (end - start) // 2 + start  # 计算中间值if start <= end:if l[mid_index] > aim:return find(l, aim, start = start, end= mid_index - 1)elif l[mid_index] < aim:return find(l, aim, start = mid_index + 1, end=end)else:return "找到了",mid_index, aimelse:return "找不到这个值", aimret = find(l, 66)
ret1 = find(l, 44)
print(ret)
print(ret1)# 结果呈现
('找到了', 17, 66)
('找不到这个值', 44)

4 , 相关练习题

4.1 斐波那契 # 问第N个斐波那契数是多少

# 1, 1, 2, 3, 5, 8
# fib(6) = fib(5) + fib(4)
# fib(5) = fib(4) + fib(3)
# fib(4) = fib(3) + fib(2)
# fib(3) = fib(2) + fib(1)
# fib(2) = 1
# fib(1) = 1
  • 使用递归 调用自己两次的方法,效率慢,占内存
def fib(n):if n == 1 or n ==2:return 1return fib(n - 1) + fib(n - 2)ret = fib(6)
print(ret)# 结果呈现
8
  • 使用递归 调用自己一次的方法
def fib(n, lst = [0]):lst[0] += 1if n == 1 or n == 2:lst[0] -= 1return 1, 1else:a, b = fib(n - 1)lst[0] -= 1if lst[0] == 0:return a+breturn b, a+bprint(fib(6))# 结果呈现
8

4.2 阶乘

def fac(n):if n == 1:return 1return n * fac(n - 1)print(fac(6))# 结果呈现
# 6!  6 * 5 * 4 * 3 * 2 * 1
720

4.3 递归函数与三级菜单

  • 三级菜单
menu = {'北京': {'海淀': {'五道口': {'soho': {},'网易': {},'google': {}},'中关村': {'爱奇艺': {},'汽车之家': {},'youku': {},},'上地': {'百度': {},},},'昌平': {'沙河': {'老男孩': {},'北航': {},},'天通苑': {},'回龙观': {},},'朝阳': {},'东城': {},},'上海': {'闵行': {"人民广场": {'炸鸡店': {}}},'闸北': {'火车战': {'携程': {}}},'浦东': {},},'山东': {},
}
  • 递归函数实现三级菜单
def threeLM(dic):while True:for k in dic:print(k)key = input('input>>').strip()if key == 'b' or key == 'q':return keyelif key in dic.keys() and dic[key]:ret = threeLM(dic[key])if ret == 'q': return 'q'threeLM(menu)
  • 递归 堆栈实现
l = [menu]
while l:for key in l[-1]:print(key)k = input('input>>').strip()   # 北京if k in l[-1].keys() and l[-1][k]:l.append(l[-1][k])elif k == 'b':l.pop()elif k == 'q':break
  • 转自 :http://www.cnblogs.com/Eva-J/articles/7205734.html

转载于:https://www.cnblogs.com/xiaoqshuo/p/9706709.html

python - - 函数 - - 递归函数相关推荐

  1. python中递归函数的基例_详谈Python基础之内置函数和递归 Python递归和循环的区别...

    Python 递归函数基例 2. 关于递归函数基例的说明,以下选项中错误的是 A 递归函数的基例决定所谓基例就是不需要递归就能求解的,一般来说是问题的最小规模下的解. 例如:斐波那契数列递归,f(n) ...

  2. Python函数之六:递归函数

    Python函数之六:递归函数 一.什么是函数的递归 1.编程语言中, 函数Func(Type a,-)直接或间接调用函数本身,则该函数称为递归函数. 2.递归的定义:一种计算过程,如果其中每一步都要 ...

  3. 【Python基础】Python 函数使用总结

    我的施工之路 目前已完成,以下五期Python专题总结: 1我的施工计划 2数字专题 3字符串专题 4列表专题 5流程控制专题 6编程风格专题 今天是Python函数专题,目录结构: Python 函 ...

  4. Python之递归函数

    前言 说到递归,如果是从其他编程语言转到 Python 的童鞋对这个词一定不会陌生,在很多情况下,使用递归可以提高程序的可读性,虽然可以完全避免编写递归函数,转而使用循环来代替,但是作为程序猿,至少必 ...

  5. python利用递归函数实现斐波那契数列_Python递归及斐波那契数列

    原博文 2016-07-01 23:30 − 递归函数 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数.举个例子,我们来计算阶乘 n! = 1 * 2 * 3 * ...

  6. Python学习笔记(四)Python函数

    (三)python 函数 一 函数简介 在日常开发中有很多代码需要在多处使用 , 为了提高代码的复用性可以把代码需要复用的代码以函数的形式进行封装 . 二. 函数的调用 Python中内置了很多的函数 ...

  7. python基础——递归函数

    python基础--递归函数 递归函数 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数.举个例子,我们来计算阶乘n! = 1 x 2 x 3 x ... x n,用 ...

  8. python fact函数_第5天:Python 函数

    函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段,所以我经常说函数是程序员规模化使用的基础. 函数能提高应用的模块性,和代码的重复利用率.在程序设计中,常将一些常用的功能模块编写成函数 ...

  9. python默认参数只被解释一次_深入讲解Python函数中参数的使用及默认参数的陷阱...

    C++里函数可以设置缺省参数,Java不可以,只能通过重载的方式来实现,python里也可以设置默认参数,最大的好处就是降低函数难度,函数的定义只有一个,并且python是动态语言,在同一名称空间里不 ...

  10. python函数的作用降低编程复杂度_Python语言程序设计 (第11期) 测验5: 函数和代码复用...

    共10道单选题和2道编程题,限答1次.限时50分钟 选择题 1.以下选项不是函数作用的是:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪ ...

最新文章

  1. 清华类脑计算成果再登Nature:张悠慧施路平团队出品,有望打破冯诺依曼瓶颈...
  2. android源码settings中显示所有正在运行进程流程分析
  3. 这一年的猫粮,我们承包了!CATCODER程序员晒猫大赛正式开启!
  4. WinForm加载外部类库项目的集成开发模式
  5. 建设研发运营一体化平台
  6. 2019蚂蚁金服面试总结(Java方向)
  7. 韦根w34是多少位_韦根接口读卡器说明书
  8. jdk8 string::_JDK 12的String :: transform方法的简要但复杂的历史
  9. ElasticSearch外部版本控制
  10. 【C++基础学习】关于C++静态数据成员
  11. java 协议这个概念_java网络协议概念是什么?
  12. 机器学习 Machine Learning中多元线性回归的学习笔记~
  13. js获取某节点的特定父节点
  14. Google出品,必属精品
  15. 利用清华镜像、阿里云镜像与豆瓣镜像pip资源
  16. Windows下制作DOS启动U盘的方法
  17. 产品经理常用的分析模型方法
  18. 思古解析js静态逆向分析
  19. win10 + ubantu双系统 彻底删除Ubantu
  20. 关于对音频的合并,左右声道的分离以及播放的操作

热门文章

  1. python之Beautiflusoup操作
  2. js容易犯错的知识点
  3. uploadify 3.1 /3.2 在Firefox,Chrome 浏览器下,进入页面请求两次问题解决办法。
  4. 逐步完善自己的3D引擎
  5. Kettle——简介
  6. 利用 Google Chart API 生成二维码大小不一致
  7. Java软件工程师面试题:Java运行时异常与一般异常有什么不一样?
  8. 读Zepto源码之Callbacks模块
  9. Linux内核基础设施
  10. TOMCAT如何配置域名,可以用本地服务进行测试