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

递归函数默认深度最大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. python之MRO和垃圾回收机制

    一.MOR 1.C3算法简介 为了解决原来基于深度优先搜索算法不满足本地优先级,和单调性的问题. python2.3版本之后不管是新式类还是经典类,查找继承顺序都采用C3算法 2.算法原理 C3算法的 ...

  2. C++/CLI泛型应用

    2019年01月16日, QQ群友不知道要折腾什么, 提出了以下问题: 样例代码中的是C#语言写的, 翻译成C++/CLI就不会了, 于是我试着谢了一下, 发现可以实现, 于是就贴出来与大家分享, 源 ...

  3. HDU6278 Just h-index

    主席树+二分 每次对给定区间从1-区间长度len二分mid,查询区间内第mid大的数是不是大于等于mid.. #include <bits/stdc++.h> #define INF 0x ...

  4. oldboy s21day10

    #!/usr/bin/env python # -*- coding:utf-8 -*-   # 1.写函数,函数可以支持接收任意数字(位置传参)并将所有数据相加并返回. ''' def func(* ...

  5. JavaScript 基本包装类型,包装对象

    前言 javascript对象是一种复合值,它是属性或已命名值的集合.通过'.'符号来引用属性值.当属性值是一个函数时,称其为方法.通过o.m()来调用对象o中的方法.我们发现,字符串也同样具有属性和 ...

  6. [再寄小读者之数学篇](2014-06-26 Logarithmical Sobolev inequality using BMO space)

    $$\bex q>3\ra \sen{\n f}_{L^\infty} \leq C(q)\sez{ 1+\sen{\n f}_{BMO} \ln^\frac{1}{2}\sex{e+\sen{ ...

  7. 有序不可变列表tuple

    tuple(元组)也是一种有序列表 但是与list不同的是,他是不可变的.一旦初始化就不可以被更改 声明方法 tuple名=(元素1,元素2,元素3--) >>> name=('To ...

  8. Java同步容器

    一.为什么会出现同步容器 Java的集合框架中,主要有四大类别:List,Set,Queue,Map List,Set,Queue接口分别继承了Collection接口,Map本身是一个接口. 注意C ...

  9. mybatis(入门级项目)

    框架的搭建:(两个java类,两个xml配置文件) 1.导入jar包,日志debug文件以及数据库的参数文件 2.建立持久化类(和数据库的列值相同的类) user类的一个扩展类: userQueryV ...

  10. Selective Search for Object Recognition(理解)

    0 - 背景 在目标检测任务中,我们希望输入一副图像,输出目标所在的位置以及目标的类别.最常用的算法是滑动窗口方法,但滑动窗口其实相当于穷举图像中的所有子图像,其效率低且精度也受限.该论文提出一种新的 ...