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

递归函数默认深度最大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. [BZOJ 3745] [COCI 2015] Norma

    Description 给定一个正整数序列 \(a_1,a_2,\cdots,a_n\),求 \[ \sum_{i=1}^n\sum_{j=i}^n(j-i+1)\min(a_i,a_{i+1},\c ...

  2. ant在windows及linux环境下安装

    ant下载 http://ant.apache.org/ https://ant.apache.org/bindownload.cgi 历史版本 ant在windows下安装 解压到D盘 新建系统变量 ...

  3. NowCoder -- 牛客小白月赛10

    A--勘测 推下公式  a[i] = a[i-1] + a[i-2] +2 #include<stdio.h> #include<string.h> ]; int main() ...

  4. Linux基本命令总结(五)

    接上篇: 21,在lunix系统里,文件或目录的权限的掌控以拥有者及所诉群组来管理.可以使用chgrp指令取变更文件与目录所属群组,这种方式采用群组名称或群组识别码都可以.Chgrp命令就是chang ...

  5. 【gdoi2018 day2】第二题 滑稽子图(subgraph)(性质DP+多项式)

    题目大意 [gdoi2018 day2]第二题 滑稽子图(subgraph) 给你一颗树\(T\),以及一个常数\(K\),对于\(T\)的点集\(V\)的子集\(S\). 定义\(f(S)\)为点集 ...

  6. GoLang-Rpc编程

    Rpc定义: RPC(Remote Procedure Call,远程过程调用)是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络细节的应用程序通信协议. RPC协议构建于TCP或UDP, ...

  7. 驱动调试(三)oops确定函数PC

    目录 驱动调试(三)oops确定函数PC 什么是oops 流程简述 代码仓库 模块例子分析 找到PC值 判断是否属于模块 查看符号表 找到模块 反汇编模块 内核例子分析 找到PC值 判断是否属于模块 ...

  8. MTD下的Nand驱动

    目录 MTD下的Nand驱动 引入 平台设备资源文件 关键数据结构 平台框架 s3c24xx_nand_probe nand_scan s3c2410_nand_add_partition add_m ...

  9. LFYZ-OJ ID: 1010 天使的起誓

    思路 理解题目后,会发现是一个高精度除低精度求余问题,非常简单. 容易出错的地方是:求余结果为0的时候,此时,天使所在的盘子号码其实就是n,如果直接返回余数,得到的结果则是0. 被除数的范围是2-10 ...

  10. 如何在IntelliJ IDEA中使用.ignore插件忽略不必要提交的文件

    如何在IntelliJ IDEA中使用.ignore插件忽略不必要提交的文件 最近初学Git,而且在使用的IDE是IntelliJ IDEA,发现IDEA在提交项目到本地仓库的时候,会把.idea文件 ...