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

(1)递归就是在过程或函数里调用自身;

(2)在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。

递归算法一般用于解决三类问题:

(1)数据的定义是按递归定义的。(比如Fibonacci函数)

(2)问题解法按递归算法实现。(回溯)

(3)数据的结构形式是按递归定义的。(比如树的遍历,图的搜索)

递归的缺点:递归算法解题的运行效率较低。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。

"""非递归方式呈现"""

sum = 0

for obj in range(1,101):

sum+=obj

print sum

""""1+2+3+...+100"""

def foo(n):

if n>0:return n+foo(n-1)

if n<=0:return 0

print foo(100)

"""阶乘"""

def fac(n):

if n==0 or n==1:

return 1

else:

return n*fac(n-1)

print fac(10)

def fact(n):

if n==1:

return 1

return n * fact(n - 1)

上面就是一个递归函数。可以试试:

如果我们计算fact(5),可以根据函数定义看到计算过程如下:

===> fact(5)

===> 5 * fact(4)

===> 5 * (4 * fact(3))

===> 5 * (4 * (3 * fact(2)))

===> 5 * (4 * (3 * (2 * fact(1))))

===> 5 * (4 * (3 * (2 * 1)))

===> 5 * (4 * (3 * 2))

===> 5 * (4 * 6)

===> 5 * 24

===> 120

递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。

使用递归函数需要注意防止栈溢出。在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。可以试试fact(1000):

def fact_iter(product,count,max):

if count > max: ####

return product ####

return fact_iter(product * count, count+1, max) ###

print(fact_iter(1,1,5)) #1*1*2*3*4*5

print(fact_iter(1,2,5))

print(fact_iter(2,3,5)) #2*3*4*5

print(fact_iter(6,4,5)) #6*4*5

print(fact_iter(24,5,5)) #24*5

print(fact_iter(120,6,5)) #120

使用递归函数的优点是逻辑简单清晰,缺点是过深的调用会导致栈溢出。

针对尾递归优化的语言可以通过尾递归防止栈溢出。尾递归事实上和循环是等价的,没有循环语句的编程语言只能通过尾递归实现循环。

Python标准的解释器没有针对尾递归做优化,任何递归函数都存在栈溢出的问题。

python递归必须要有_python递归相关推荐

  1. python遍历任意层次字典_Python递归中 return 代码陷阱

    1 #获取字典中的objkey对应的值,适用于字典嵌套 2 #targetDict:要查找的字典;serchKey:要查找的目标key 3 #ret:递归过程中,向外部(上层)传送 return值.被 ...

  2. python递归调用详解_Python递归调用自己的函数

    原博文 2019-11-16 10:36 − def fact(x): if x == 1: return 1 else: return x * fact(x-1) ... 0 191 相关推荐 20 ...

  3. python利用递归函数实现斐波那契数列_Python递归及斐波那契数列

    原博文 2016-07-01 23:30 − 递归函数 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数.举个例子,我们来计算阶乘 n! = 1 * 2 * 3 * ...

  4. python函数作用域与闭包_python基础-08-内置函数、作用域、闭包、递归

    python基础-内置函数.作用域.闭包.递归 1.常见的内置函数 常见的内置函数: 查看内置函数: print(dir(__builtins__)) 常见函数 type() 数据类型 print() ...

  5. 在python中用递归的方法编程_python基础之函数,递归,内置函数

    阅读目录 一 数学定义的函数与python中的函数 初中数学函数定义:一般的,在一个变化过程中,如果有两个变量x和y,并且对于x的每一个确定的值,y都有唯一确定的值与其对应,那么我们就把x称为自变量, ...

  6. python函数递归求和详解_Python递归函数详细分析

    什么是递归? 递归,就是在函数运行中自己调用自己 代码示例: def recursion(n): # 定义递归函数 print(n) # 打印n recursion(n+1) # 在函数的运行种调用递 ...

  7. python递归必须要有_Python的递归

    递归 是指函数/过程/子程序在运行过程序中直接或间接调用自身而产生的重入现象.在计算机编程里,递归指的是一个过程:函数不断引用自身,直到引用的对象已知.使用递归解决问题,思路清晰,代码少.但是在主流高 ...

  8. python匿名函数的作用_Python中的匿名函数及递归思想简析

    匿名函数 前言 上次咱们基本说了一下函数的定义及简单使用,Python中的基本函数及其常用用法简析,现在咱们整点进阶一些的.同样都是小白,咱也不知道实际需要不,但是对于函数的执行顺序以及装饰器的理解还 ...

  9. python解决物理问题_python递归解物理题

    课程设计:丁大喵 文章编辑:丁丁猫 关键词:递归 电阻 全局变量 This resistive network formsan infinite binary tree--every branch s ...

最新文章

  1. [译]Mimic, 轻量级Web Service测试桩
  2. 面试官:我想用Nginx提升系统10倍性能,你有哪些建议?
  3. MariaDB的Aria存储引擎
  4. Visual Studio 2017 15.6发布
  5. C++ 引用本质就是一个指针常量
  6. gdal for java_gdal java环境配置
  7. ssis 数据转换_SSIS数据透视和SSIS数据透视转换概述
  8. 5. 直接三角形分解法
  9. 在 IIS 中部署 SPA 应用,多么痛的领悟!
  10. [转载] python字符串情感分析_python进行情感分析
  11. 元胞自动机及其MATLAB实例
  12. 一、数据挖掘—初识数据挖掘
  13. 西安电子科技大学计算机学院评论,放弃985,选择西安电子科技大学计算机专业,网友表示没毛病...
  14. 浙江杭州1040阳光工程叫家里人来投资违不违法?能不能赚到钱?
  15. 基于Altium Designer 09制作LOGO的方法
  16. 看google如何招人
  17. 过去式与过去分词的用法与区别
  18. 什么是软件危机?软件危机的主要表现是什么?什么是软件?什么是软件工程?什么是软件过程?软件过程与软件工程方法学有何关系?​​​​​​​什么是软件开发方法?软件开发方法主要有哪些?
  19. 用计算机弹最简单的歌,计算器也能演奏美妙音乐
  20. php镂空窗,镂空文字效果 视频画面变成镂空文字效果制作

热门文章

  1. 模拟银行账户业务,bank添加带参方法实现存款和取款业务, 存款时帐户初始金额为0元,取款时如果余额不足给出提示。
  2. 什么蓝牙耳机质量好,2021最好的蓝牙耳机排行榜
  3. 再来聊聊SEO和SEM的区别,数字营销必备
  4. CreateWindow与CreateWindowEx函数详解
  5. 根据CAD文件的坐标信息给矢量图设置正确的投影坐标
  6. 用BPM打造企业新门户,步入移动办公时代
  7. 千年虫及UNIX时间
  8. 模拟QQ注册练习HTML5的表单form
  9. 字符数组赋值报“表达式必须是可修改的左值”的错误
  10. windows服务器部署项目