高阶函数-递归

1.高阶函数

1.1高阶函数定义

变量可以指向函数,函数的参数能接受变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称为高阶函数。
只要满足以下任意一个条件,即是高阶函数
1.接收一个或多个函数作为输入
2.return返回另外一个函数

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita

def add(x, y, func):
    return func(x) + func(y)
res = add(3, -6, abs)
print(res)

E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
9

Process finished with exit code 0

2.递归

2.1递归定义

在函数内部,可以调用其它函数。如果一个函数在内部调用自身,这个函数就是递归函数。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita

def calc(n):
    print(n)
    if int(n/2) == 0:
        return n
    return calc(int(n/2))
calc(4)

E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
4
2
1

Process finished with exit code 0

2.2递归的执行过程

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita

def calc(n):
    print(n)
    if int(n/2) > 0:
        calc(int(n/2))
    print(n)
calc(4)

E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
4
2
1
1
2
4

Process finished with exit code 0

```![](https://s1.51cto.com/images/blog/201905/01/c0982168aae8b7f5c44a1ffd214523f3.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
  ## 2.3递归特性
    >1.必须有一个明确的结束条件
    >2.每次进入更深一层递归时,问题规模相比上次递归都应有所减少
    >3.递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用时通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以递归调用的次数过多,会导致栈溢出)
#!/usr/bin/env python

-- coding:utf-8 --

Author: vita

def recursion(n):
print(n)
recursion(n + 1)

recursion(1)
运行
...
996
997
998
Process finished with exit code 1
"到998程序就自动停止了,是因为递归的最大深度是有限制的,防止栈溢出"


    ## 2.4二分法查找
#!/usr/bin/env python

-- coding:utf-8 --

Author: vita

data = [1, 3, 5, 7, 8, 10, 30, 34, 35]

def binary_search(source_data, search_data):
print(source_data)
if len(source_data) > 1:
mid_data_index = int(len(source_data)/2)
if source_data[mid_data_index] == search_data:
print("excellent,you have found it!")
elif source_data[mid_data_index] > search_data:
source_data = source_data[0:mid_data_index]
binary_search(source_data, search_data)
elif source_data[mid_data_index] < search_data:
source_data = source_data[mid_data_index + 1:]
binary_search(source_data, search_data)
else:
if len(source_data) == 0:
print("source data is null now!")
else:
if source_data[0] == search_data:
print("you have found it!")
else:
print("there is not this number!")
binary_search(data, 30)

E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
[1, 3, 5, 7, 8, 10, 30, 34, 35]
[10, 30, 34, 35]
[10, 30]
excellent,you have found it!

Process finished with exit code 0
"找4"
binary_search(data, 4)
E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
[1, 3, 5, 7, 8, 10, 30, 34, 35]
[1, 3, 5, 7]
[1, 3]
[]
source data is null now!

Process finished with exit code 0

```
## 2.5求阶乘
```
#!/usr/bin/env python

-- coding:utf-8 --

Author: vita

def multi(n):
if n == 1:
return 1
else:
return n*multi(n-1)

print(multi(4))

E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
24

Process finished with exit code 0

```
## 2.6斐波那契
```
#!/usr/bin/env python

-- coding:utf-8 --

Author: vita

1 1 2 3 5 8 13

a = 0
b = 1
n = 0
def fibs(a, b):
global n
a, b = b, a + b
print(a)
if n == 5:
return
n += 1
fibs(a, b)

fibs(a,b)

E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
1
1
2
3
5
8

Process finished with exit code 0

```
## 2.7尾递归
>再讲递归特性时,我们说递归效率不高,因为每递归一次,就多了一层栈,递归次数过多就会栈溢出,这也是Python默认会限制递归次数的原因。但有一种方式是可以在递归过程中不产生多层栈,即尾递归。

如果一个函数中所有递归形式的调用都出现在函数的末尾,我们称这个递归函数是尾递归的。当递归调用时整个函数体重最后执行的语句且它的返回值不属于表达式的一部分,这个递归调用就是尾递归。尾递归函数的特点是在回归过程中不用做任何操作,这个特性很重要,因为大多数现代的编译机会利用这个特点自动生成优化的代码。
当编译器检测到一个函数调用时尾递归,就会覆盖当前活动记录,而不是在栈中去创建新的。编译器可以做到这点,因为递归调用时当前活跃期内最后执行的一条语句,于是当这个调用返回时帧栈中并没有其他事情可做,因此也就没有保存栈帧的必要了。通过覆盖当前的栈帧而不是重新添加一个,这样就节省了栈帧的使用,运行效率变高。

原文地址:https://blog.51cto.com/10983441/2388156

时间: 2024-10-11 23:28:39

高阶函数-递归的相关文章

Python学习笔记八:文件操作(续),文件编码与解码,函数,递归,函数式编程介绍,高阶函数

文件操作(续) 获得文件句柄位置,f.tell(),从0开始,按字符数计数 f.read(5),读取5个字符 返回文件句柄到某位置,f.seek(0) 文件在编辑过程中改变编码,f.detech() 获取文件编码,f.encoding() 获取文件在内存中的编号,f.fileno() 获取文件终端类型(tty.打印机等),f.isatty() 获取文件名,f.name() 判断文件句柄是否可移动(tty等不可移动),f.seekable() 判断文件是否可读,f.readable() 判断文件是

11.高阶函数(匿名/*递归/函数式)对象编程基础

高阶函数匿名函数匿名函数存在的情况:内置函数函数式编程递归函数式编程面向对象的程序设计类:实例:OOP类的名称空间/对象的名称空间 高阶函数 匿名函数 lambda x:x+y #return x+y 定义标志/参数(形式类似函数传参)/跟表达式(返回) 匿名函数存在的情况: 执行完这行之后,如果没有被赋值给别的变量 其引用计数为0,就会被内存垃圾回收机制清空 from functoolimport reduce sorted 倒序并且生成新列表/sort是仅仅倒序 map 映射 reduce

Python 3 学习笔记(五)----变量、递归和高阶函数

一.变量 1.在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量.2.全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序.3.当全局变量与局部变量同名时:在定义局部变量的子程序内,局部变量起作用:在其它地方全局变量起作用. 1 country = "China" #全局变量 2 3 def change_name(name): 4 global country #如果要在函数中更改全局变量,只有一种方法在函数中声明global+变量名.永远不要用这种方法

python第三天学习复习,集合set,文件操作,函数(普通函数,递归,高阶函数),字符编码和解码

三元运算 age = 23 #就是if else的简单写法 a = age if age < 20 else 25 集合 set #集合是无序切不重复的, #当对列表去重复的时候,可以直接使用 set(list),就将list转为set,并去除中间重复的 list = [1,2,3,4,5,5,6,7,8,9,1] s = set(list) 运行结果:可以发现将 list中重复的去掉,并且类型变成set,再使用list(set),转为list 集合操作 # Author:zylong set1

高阶函数与递归

什么是高阶函数? 变量可以指向函数,函数的参数能接收变量,函数可以接收另一个函数作为参数,我们称为高阶函数. def calc(x): return x*x f = calc f = lambda x:x*x #匿名函数 变量指向函数 x = 10 def calc(x): return x*x 函数接收变量 def func(x,y): return x + y def calc(x): return x f = calc(func) print(f(5,6)) 函数接收另一个函数当做参数 只

Haskell高阶函数

Haskell functions can take functions as parameters and return functions as return values. A function that does either of those is called a higher order function. Higher order functions aren't just a part of the Haskell experience, they pretty much ar

高阶函数之函数作为参数

SICP 1.3.1  Procedures as Arguments,说明高阶函数之函数作为参数的原因:若干个函数拥有相似的算法或代码结构,对此加以抽象. (define (sum-integers a b) (if (> a b) 0 (+ a (sum-integers (+ a 1) b)))) (define (pi-sum a b) (if (> a b) 0 (+ (/ 1.0 (* a (+ a 2))) (pi-sum (+ a 4) b)))) 于是: 清单1: (defi

Day3-递归函数、高阶函数、匿名函数、内置函数

一.递归函数 定义:函数内部可以调用其它函数,如果调用自身,就叫递归. 递归特性: 1.必须有结束条件退出: >>> def calc(n): ... print(n) ... return calc(n+1) ... >>> calc(0) 0 1 ... 998 RecursionError: maximum recursion depth exceeded while calling a Python object 分析: 没有结束条件,超过最大递归次数999次后

Scala 高阶函数(high-order function)剖析

Scala 是一种函数式编程语言,也就是说每一个函数都是一个值.Scala 有很简洁的语法用于定义匿名函数.curry 化函数(curried function).应用函数.偏函数以及嵌套函数等.函数式编程由数学函数演变得来,包含大量诸如串联与并联.组合与分离.协变与逆变等一系列概念.本文将就如何实现高阶函数进行阐述,其他部分内容不进行深究. 类型参数化协变与逆协变 类型参数化(type parameterization)由类型协变性(Type variance)补充构成,类型协变性的机制则是在