python 递归与递归函数

递归的定义——在一个函数里再调用这个函数本身

现在我们已经大概知道刚刚讲的story函数做了什么,就是在一个函数里再调用这个函数本身,这种魔性的使用函数的方式就叫做递归

刚刚我们就已经写了一个最简单的递归函数。

递归的最大深度——997

正如你们刚刚看到的,递归函数如果不受到外力的阻止会一直执行下去。但是我们之前已经说过关于函数调用的问题,每一次函数调用都会产生一个属于它自己的名称空间,如果一直调用下去,就会造成名称空间占用太多内存的问题,于是python为了杜绝此类现象,强制的将递归层数控制在了997

可以用一段代码来验证默认递归深度:

1 def foo(n):
2     print(n)
3     n += 1
4     foo(n)
5 foo(1)

可以通过一定方法来修改默认递归深度:

1 import sys
2 print(sys.setrecursionlimit(100000))

递归实力实例讲解:

现在你们问我,alex老师多大了?我说我不告诉你,但alex比 egon 大两岁。

你想知道alex多大,你是不是还得去问egon?egon说,我也不告诉你,但我比武sir大两岁。

你又问武sir,武sir也不告诉你,他说他比金鑫大两岁。

那你问金鑫,金鑫告诉你,他40了。。。

这个时候你是不是就知道了?alex多大?

1  金鑫  40

2  武sir  42

3  egon 44

4  alex   46

以上的过程已经非常接近递归的思想,再具体的分析一下这几个人之间的规律。

使用代码表示就是:

1 age(4) = age(3) + 2
2 age(3) = age(2) + 2
3 age(2) = age(1) + 2
4 age(1) = 40

相应的,函数应该这样写:

1 def age(n):
2     if n == 1:
3         return 40
4     else:
5         return age(n-1)+2
6
7 print(age(4))

由此可以得到递归和递归函数的本质:通过两级之间的关系不断往已知条件查找(未知联系已知)使用已知条件来解决未解的问题。

递归的实际应用:算法(二分法查找)

对一串简单的,按照大小排序的数,要找到其中一个数的位置,应该怎么做?

按照常规的方法,使用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]

我们每次都取中间的数,根据中间的数的大小来决定我们要找的数的位置(左边or右边)

这样每次不断取,就可以不断接近要取的数的位置了,最后就可以找到我们要找的数的位置了。

这就是二分查找算法

那么落实到代码上我们应该怎么实现呢?

简单版本:

 1 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]
 2
 3 def func(l,aim):
 4     mid = (len(l)-1)//2
 5     if l:
 6         if aim > l[mid]:
 7             func(l[mid+1:],aim)
 8         elif aim < l[mid]:
 9             func(l[:mid],aim)
10         elif aim == l[mid]:
11             print("bingo",mid)
12     else:
13         print(‘找不到‘)
14 func(l,66)
15 func(l,6)

高端版本:

 1 def search(num,l,start=None,end=None):
 2     start = start if start else 0
 3     end = end if end else len(l) - 1
 4     mid = (end - start)//2 + start
 5     if start > end:
 6         return None
 7     elif l[mid] > num :
 8         return search(num,l,start,mid-1)
 9     elif l[mid] < num:
10         return search(num,l,mid+1,end)
11     elif l[mid] == num:
12         return mid
 

---恢复内容结束---

递归的定义——在一个函数里再调用这个函数本身

现在我们已经大概知道刚刚讲的story函数做了什么,就是在一个函数里再调用这个函数本身,这种魔性的使用函数的方式就叫做递归

刚刚我们就已经写了一个最简单的递归函数。

递归的最大深度——997

正如你们刚刚看到的,递归函数如果不受到外力的阻止会一直执行下去。但是我们之前已经说过关于函数调用的问题,每一次函数调用都会产生一个属于它自己的名称空间,如果一直调用下去,就会造成名称空间占用太多内存的问题,于是python为了杜绝此类现象,强制的将递归层数控制在了997

可以用一段代码来验证默认递归深度:

1 def foo(n):
2     print(n)
3     n += 1
4     foo(n)
5 foo(1)

可以通过一定方法来修改默认递归深度:

1 import sys
2 print(sys.setrecursionlimit(100000))

递归实力实例讲解:

现在你们问我,alex老师多大了?我说我不告诉你,但alex比 egon 大两岁。

你想知道alex多大,你是不是还得去问egon?egon说,我也不告诉你,但我比武sir大两岁。

你又问武sir,武sir也不告诉你,他说他比金鑫大两岁。

那你问金鑫,金鑫告诉你,他40了。。。

这个时候你是不是就知道了?alex多大?

1  金鑫

2

3

4

原文地址:https://www.cnblogs.com/flashpoint3/p/8276335.html

时间: 2024-10-09 05:17:32

python 递归与递归函数的相关文章

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

本文和大家分享的主要是python的递归函数及二分查找算法相关内容,一起来看看吧,希望对大家学习python有所帮助. 一.递归的定义 def story(): s = """ 从前有个山,山里有座庙,庙里老和尚讲故事, 讲的什么呢? """ print(s) story() story() 老和尚讲故事 递归的定义 -- 在一个函数里再调用这个函数本身.这种魔性的使用函数的方式就叫做 递归 . 递归的最大深度:997 1.python递归最大层

汉诺塔问题的Python递归实现

汉诺塔问题的python递归实现 学习python遇到的第一个问题:汉诺塔问题的实现.首先是不知道什么是汉诺塔问题,然后是不知道怎么实现.于是百度了下,结果如下: 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘 def hanoi(n,x,y,z): i

Python递归报错:RuntimeError: maximum recursion depth exceeded in comparison

Python中默认的最大递归深度是989,当尝试递归第990时便出现递归深度超限的错误: RuntimeError: maximum recursion depth exceeded in comparison 简单方法是使用阶乘重现: 1 #! /usr/bin/env Python 2 3 def factorial(n): 4 5 if n == 0 or n == 1: 6 7 return 1 8 9 else: 10 11 return(n * factorial(n - 1)) >

Python递归遍历目录下所有文件

#自定义函数: import ospath="D:\\Temp_del\\a" def gci (path): parents = os.listdir(path) for parent in parents: child = os.path.join(path,parent) #print(child) if os.path.isdir(child): gci(child) # print(child) else: print(child) gci(path) #使用os.walk方

Python递归实现汉诺塔

Python递归实现汉诺塔: def f3(n,x,y,z): if(n==1): print(x,'--->',z) else: f3(n-1,x,z,y) print(x,'--->',z) f3(n-1,y,x,z) n=int(input('请输入汉罗塔层数:')) f3(n,'X','Y','Z') 运行结果如下:

python入门16 递归函数 高阶函数

递归函数:函数内部调用自身.(要注意跳出条件,否则会死循环) 高阶函数:函数的参数包含函数 递归函数 #coding:utf-8 #/usr/bin/python """ 2018-11-17 dinghanhua 递归函数 高阶函数 """ '''递归函数,函数内部调用函数本身''' '''n!''' def f_mul(n): if type(n) != type(1) or n <= 0: #不是整数或小于0 raise Except

Python递归及斐波那契数列

递归函数 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数.举个例子,我们来计算阶乘 n! = 1 * 2 * 3 * ... * n,用函数 fact(n)表示,可以看出:fact(n) = n! = 1 * 2 * 3 * ... * (n-1) * n = (n-1)! * n = fact(n-1) * n所以,fact(n)可以表示为 n * fact(n-1),只有n=1时需要特殊处理.于是,fact(n)用递归的方式写出来就是: def fact(

Python递归和迭代

递归 在函数内部,程序调用自身的编程技巧称为递归( recursion).递归函数结构清晰,很直观的理解计算过程,但也有严重缺点:相对于普通循环而言,递归运行效率较低,经过很多冗余的计算,递归会消耗大量的调用堆栈.在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧.每当函数返回,栈就会减一层栈帧.由于栈的大小不是无限的,因此,递归调用的次数过多,会导致栈溢出.因此,应该尽量用循环代替递归.在递归调用的过程当中系统为每一层的返回点.局部量等开辟了栈

16 Python 递归例题

递归 1.什么是递归 recursion 递归 - 递归的定义--在一个函数里再调用这个函数本身 在一个函数里再调用这个函数本身,这种魔性的使用函数的方式就叫做递归. 递归的最大深度--997 一个函数在内部调用自己 递归的层数在python里是有限制的 997/998层 2.层数可以修改 sys模块 1 import sys #python限制在997/998 2 sys.setrecursionlimit(10000000) #可以修改 3 COUNT = 0 4 def func(): #