在一个函数调用这个函数本身就是递归函数

递归函数默认深度最大997

n = 0
def func():
global n
n += 1
print('hello,world')
print(n)
func()
print('你好,中国')
func()

当然,最大深度也是可以调整的,根据计算机性能改变

import sys
sys.setrecursionlimit(100000)
n = 0
def func():
global n
n += 1
print('hello,world')
print(n)
func()
print('你好,中国')
func()

递归实例:

A 比 B大2岁,B 比 C大2岁,C 比 D大2岁,D 比 E大2岁,E今年20岁。

如果你问A的年龄,则由 A 推到 E,再由 E 计算到 A 。得到下面一个小公式

A 比 B 大 2 岁 n = 1      age(1) = age(2) + 2
B 比 C 大 2 岁 n = 2 age(2) = age(3) + 2
C 比 D 大 2 岁 n = 3 age(3) = age(4) + 2
D 比 E 大 2 岁 n = 4 age(4) = age(5) + 2
E 今年 20 n = 5 age(5) = 20

得到函数

def age(n):
if n == 5:
return 20
elif n >0 and n < 5:
return age(n+1) + 2 print(age(1))

递归函数:二分法查找算法

假设有这样一个列表,从中找到66的位置,如何做?
x = [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]

已知的,此处我们有两种方法

lst = [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]

# 方法1
print(lst.index(66)) # 方法2:
num = 0
for i in lst:
if i == 66:
print('找到了,在位置:',num)
num += 1

若没有索引和for循环呢? 此处我们用二分法。

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  # 先找到中间数41,41 < 66

                      42,43,55,56,66,67,69,72,76,82,83,88   # 再找到42-88中间数,67 > 66
               
                      42,43,55,56,66,              # 找到 42-66中间数 55 < 66
                          56,66                # 找56-66中间数
                             66                # 最后找到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]
def find(l,aim):
mid_index = len(l) // 2
if l[mid_index] < aim:
new_l = l[mid_index + 1 :]
find(new_l,aim)
elif l[mid_index] > aim:
new_l = l[:mid_index]
find(new_l,aim)
else:
print('找到了',mid_index,l[mid_index]) find(l,66)

修改至索引不发生改变,但是这里需要面对几个问题:

1.end=len(l)此处不可变

2.如果数字不在列表内的问题

3.返回值问题

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(lst,aim,start=0,end=len(l)):
mid_index = (end - start) // 2 + start
if lst[mid_index] < aim:
find(lst,aim,start=mid_index+1,end=end)
elif lst[mid_index] > aim:
find(lst,aim,start=start,end=mid_index-1)
else:
print('找到了',mid_index,aim)
find(l,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]
def find(lst,aim,start=0,end=None):
end = len(lst) if end is None else end # 如果end是默认空值,就用end,如果传回来不是空则用传回来的
mid_index = (end - start) // 2 + start
if start <= end:
if lst[mid_index] < aim:
return find(lst,aim,start=mid_index+1,end=end)
elif lst[mid_index] > aim:
return find(lst,aim,start=start,end=mid_index-1)
else:
return ('找到了',mid_index,aim)
else:
return ('找不到这个值')
ret = find(l,83)
print(ret)

斐波那契数列

1,1,2,3,5,8,13,21

双递归效率及其低下,双递归

def feib(n):
if n == 1 or n ==2 :
return 1
else:
return feib(n-1) + feib(n - 2)  ### 双递归 ret = feib(8)
print(ret)

day17.初识递归函数的更多相关文章

  1. python基础一 day17 初识递归

    #递归函数 # 了解什么是递归 : 在函数中调用自身函数 # 最大递归深度默认是997/998 —— 是python从内存角度出发做得限制 # 能看懂递归 # 能知道递归的应用场景 # 初识递归 —— ...

  2. day17:递归函数

    1,递归函数是一个函数体系,非常的难 2,练习题一 # 3.用map来处理字符串列表,把列表中所有人都变成sb,比方alex_sb name=['alex','wupeiqi','yuanhao',' ...

  3. python 全栈开发,Day17(初识面向对象)

    一.引子 第一次参加工作,进入了一家游戏公司,公司需要开发一款游戏<人狗大战>一款游戏,首先得把角色和属性定下来. 角色有2个,分别是人和狗属性如下:人 :昵称.性别.血.攻击力狗 :名字 ...

  4. Python之递归函数

    递归函数 初识递归函数 递归函数的定义:在一个函数里再调用这个函数本身 Python为了考虑保护内存占用情况,有一个递归深度的限制. 探究递归的默认最大深度: def foo(n): print(n) ...

  5. python:递归函数

    1,初识递归函数 1)什么是递归函数? 在函数中自己调用自己叫做递归函数 递归函数超过一定程度会报错.---RecursionError: maximum recursion dep th excee ...

  6. python之路——17

    王二学习python的笔记以及记录,如有雷同,那也没事,欢迎交流,wx:wyb199594 复习 1.迭代器2.生成器3.内置函数 1.学习55个 2.带key的,max min filter map ...

  7. python基础篇(四)

    PYTHON基础篇(四) 内置函数 A:基础数据相关(38) B:作用域相关(2) C:迭代器,生成器相关(3) D:反射相关(4) E:面向对象相关(9) F:其他(12) 匿名函数 A:匿名函数基 ...

  8. 2018-11-9-匿名函数&递归函数初识

    1.匿名函数(lambda) 2.递归函数初识

  9. python之内置函数(二)与匿名函数、递归函数初识

    一.内置函数(二)1.和数据结构相关(24)列表和元祖(2)list:将一个可迭代对象转化成列表(如果是字典,默认将key作为列表的元素).tuple:将一个可迭代对象转化成元组(如果是字典,默认将k ...

随机推荐

  1. 「线性基」学习笔记and乱口胡总结

    还以为是什么非常高大上的东西花了1h不到就学好了 线性基 线性基可以在\(O(nlogx)\)的时间内计算出\(n\)个数的最大异或和(不需要相邻). 上述中\(x\)表示的最大的数. 如何实现 定义 ...

  2. zookeeper的单实例和伪集群部署

    原文链接: http://gudaoyufu.com/?p=1395 zookeeper工作方式 ZooKeeper 是一个开源的分布式协调服务,由雅虎创建,是 Google Chubby 的开源实现 ...

  3. Windows下Redis的安装和部署

    Redis 简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久 ...

  4. 绕过阿里云waf进行SQL注入

    做个笔记吧,某SQL注入点的绕过,有阿里云waf的. 首先遇到是个搜索框的注入点: 演示下: 针对搜索框,我们的sql语句一般是怎么写的? 本地演示:select * from product whe ...

  5. Linux测试硬盘读性能的常用工具-hdparm和dd俩搭档

    Linux测试硬盘读性能的常用工具-hdparm和dd俩搭档 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.hparm        # 它用来在基于 Linux的系统上获取或 ...

  6. 金融量化分析【day113】:聚宽自带策略

    一.策略代码 # 导入函数库 from jqdata import * # 初始化函数,设定基准等等 def initialize(context): # 设定沪深300作为基准 set_benchm ...

  7. EF CodeFirst系列(8)--- FluentApi配置单个实体

    我们已经知道了在OnModelCreating()方法中可以通过FluentApi对所有的实体类进行配置,然而当实体类很多时,我们把所有的配置都放在OnModelCreating()方法中很难维护.E ...

  8. JS的基础知识回顾

    前言:JS应用在浏览器端,基于浏览器事件执行,功能十分强大,不容错过

  9. Gradle(一)安装配置

    Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具.它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置.面向 ...

  10. python GUI 之 tkinter

    写一个 登陆窗口来学习 tkinter ,还剩下一些问题 代码暂时如下 import tkinter as tk import webbrowser import pickle from tkinte ...