文档章节

零基础学python-18.2 递归函数与分解递归函数的执行步骤

raylee2015
 raylee2015
发布于 2015/10/21 08:10
字数 696
阅读 2
收藏 0
点赞 0
评论 0

这一章节我们来讨论一下递归函数,一个经常避免使用的,但又不得不学会的函数

递归函数:函数Func(Type a,……)直接或间接调用函数本身,则该函数称为递归函数

我下面以递归求和为例子:

>>> def test(x):
	print(x)
	if not x:
		return 0
	else :
		return x[0]+test(x[1:])

	
>>> test([1,2,3,4,5])
[1, 2, 3, 4, 5]
[2, 3, 4, 5]
[3, 4, 5]
[4, 5]
[5]
[]
15


如果我单纯给出上面的例子,大家是不是觉得非常的难以理解呢?

我把上面的代码换一下:

>>> def test(x):
	print(x)
	if not x:
		return 0
	else :
		a=test(x[1:])
		print(a)
		return x[0]+a

	
>>> test([1,2,3,4,5])
[1, 2, 3, 4, 5]
[2, 3, 4, 5]
[3, 4, 5]
[4, 5]
[5]
[]
0
5
9
12
14
15
>>>


这样可能理解起来会容易点,我下面将会一步步的将上面的函数的执行过程分解给大家

1.当[1,2,3,4,5]赋值到参数x里面,它会先执行print语句

2.然后判断x是否还有对象,因为x存在对象,所以执行else的语句

3.现在执行a=test[1:]这个语句,现在的x=[1,2,3,4,5],然后传递新的test的参数x的对象是[2,3,4,5]

循环步骤1到3,直到x=[]

4.由于test([])返回0,返回0,注意:这个时候test(x)里面的x是[],反推回去,也即是x[1:]=[],x=[5]

5.由于test([])执行完返回0,x=[5],所以这个时候test([5])返回5

6.同理,test([4,5])返回9,test([3,4,5])返回12,直到a=test([2,3,4,5]),a=14,打印a,然后x[0]=1,x[0]+14=15,因此最后会返回15

 

其实,上面的代码类似于:

>>> def test(aList):
	res=0
	for item in aList:
		res+=item
	return res

>>> test([1,2,3,4,5])
15
>>>

很多时候递归跟循环接近,但是递归有一个好处就是遍历结构所有的数据项

由于感觉上面说到不够明了,所以我们下面再举一个简单一点的例子:test([1,2,3])

>>> def test(x):	
	if not x:
		return 0
	else :
		a=test(x[1:])		
		return x[0]+a

	
>>> test([1,2,3])
6
>>>


分解步骤:

test([1,2,3])

  if not x:

      return 0

  else:

      a=test([2,3])

             if not x:

                 return 0

             else:

                 a=test([3])

                        if not x:

                           return 0

                        else:

                            a=test([])

                                   if not x:

                                      return 0#对应test([])

                            return 3+0#对应test([3])

                   return 3+2#对应test([2,3])

        return 5+1#对应test([1,2,3])

>>>6

上面的步骤应该比较明细的了

 

总结:我们这一章节简单介绍了递归函数以及分解了递归函数的步骤

 

这一章节就说到这里,谢谢大家

------------------------------------------------------------------

点击跳转零基础学python-目录

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

本文转载自:http://blog.csdn.net/raylee2007/article/details/48530025

共有 人打赏支持
raylee2015
粉丝 6
博文 265
码字总数 44224
作品 0
江门
用python玩转数据|基本语法

比较运算符 打开文件 模块:一个完整的python文件即是一个模块 包:一个有层次的文件目录结构 库:一组具有相关功能的模块的集合 题目1:接收键盘输入姓、名,然后分解输出 输出: 第一单元小...

darlingwood2013
2017/03/08
0
0
人人都能学会的python编程教程13:递归函数

话说美食街上有个煎包店,1块钱2个,2块钱3个,3块钱5个,5块钱8个。人们笑称之为斐波拉切煎包。 在数学上,斐波纳契数列被以递归的方法定义:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n...

编程老司机
05/10
0
0
Python函数式编程中map()、reduce()和filter()函数的用法

Python中、和三个函数均是应用于序列的内置函数,分别对序列进行遍历、递归计算以及过滤操作。这三个内置函数在实际使用过程中常常和联合使用,我们首先介绍下lambda函数。1、lambda函数 la...

损失函数
05/24
0
0
他学习一年Python找不到工作,大佬都说你别再学Python了!

都说,滴水穿石非一日之功。然而有些人即使奋斗一辈子也比不上别人一年,别人学习一年比不得你学习一个月。其中缘由,有些人看了大半辈子还没看明白。 即使Python这么火,为何你学习一年的P...

柯西带你学编程
06/06
0
0
python语法小细节及小定义(一)

首先,Python是强类型语言,动态类型语言。 那么什么是强类型语言?就是数据类型非常固定的语言,例如说python中的str类型数据和int类型数据不能互相作用。而c和js就是弱类型语言。 动态类型...

戴千岩
2017/09/26
0
0
Python基础班每日整理(四)

02Python基础day06 字符串的定义 字符串就是一串字符,用一对儿单引号或者双引号括起来 字符串切片 切片就是使用索引值,从一个大的字符串中切出小的字符串,适用于字符串、元组、列表。基本...

我是小谷粒
07/02
0
0
笨办法学 Python · 续 练习 19:改善性能

练习 19:改善性能 原文:Exercise 19: Improving Performance 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 这几乎完全是视频练习,其中我演示了如何改进你至今为止编写的代码的性...

apachecn_飞龙
2017/08/09
0
0
Python二次元世界-Lisp的帝国斜阳 lambda与closure

Python二次元世界-函数式编程 Function , lambda与closure 本章讲述Python语言自Lisp语言演变而来的一些高级函数编程技巧 如闭包(closure) 匿名函数(lambda) 生成器(yield) 嵌套作用域(ne...

圣何塞白话人
2012/05/13
0
0
一个月入门Python爬虫,快速获取大规模数据

数据是创造和决策的原材料,高质量的数据都价值不菲。而利用爬虫,我们可以获取大量的价值数据,经分析可以发挥巨大的价值,比如: 豆瓣、知乎:爬取优质答案,筛选出各话题下热门内容,探索...

Python开发者
04/25
0
0
Python第四课----函数

函数 一、函数 由若干语句组成的语句块,函数名称、参数列表构成,它是组织代码的最小单元。 二、函数的作用 1、对代码的最基本封装,按照功能组织一段代码。2、目的为了复用,减少冗余代码。...

菜鸡满地跑
06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

about git flow

  昨天元芳做了git分支管理规范的分享,为了拓展大家关于git分支的认知,这里我特意再分享这两个关于git flow的链接,大家可以看一下。 Git 工作流程 Git分支管理策略   git flow本质上是...

qwfys
今天
2
0
Linux系统日志文件

/var/log/messages linux系统总日志 /etc/logrotate.conf 日志切割配置文件 参考https://my.oschina.net/u/2000675/blog/908189 dmesg命令 dmesg’命令显示linux内核的环形缓冲区信息,我们可...

chencheng-linux
今天
1
0
MacOS下给树莓派安装Raspbian系统

下载镜像 前往 树莓派官网 下载镜像。 点击 最新版Raspbian 下载最新版镜像。 下载后请,通过 访达 双击解压,或通过 unzip 命令解压。 检查下载的文件 ls -lh -rw-r--r-- 1 dingdayu s...

dingdayu
今天
1
0
spring boot使用通用mapper(tk.mapper) ,id自增和回显等问题

最近项目使用到tk.mapper设置id自增,数据库是mysql。在使用通用mapper主键生成过程中有一些问题,在总结一下。 1、UUID生成方式-字符串主键 在主键上增加注解 @Id @GeneratedValue...

北岩
今天
2
0
告警系统邮件引擎、运行告警系统

告警系统邮件引擎 cd mail vim mail.py #!/usr/bin/env python#-*- coding: UTF-8 -*-import os,sysreload(sys)sys.setdefaultencoding('utf8')import getoptimport smtplibfr......

Zhouliang6
今天
1
0
Java工具类—随机数

Java中常用的生成随机数有Math.random()方法及java.util.Random类.但他们生成的随机数都是伪随机的. Math.radom()方法 在jdk1.8的Math类中可以看到,Math.random()方法实际上就是调用Random类...

PrivateO2
今天
3
0
关于java内存模型、并发编程的好文

Java并发编程:volatile关键字解析    volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在...

DannyCoder
昨天
1
0
dubbo @Reference retries 重试次数 一个坑

在代码一中设置 成retries=0,也就是调用超时不用重试,结果DEBUG的时候总是重试,不是0吗,0就不用重试啊。为什么还是调用了多次呢? 结果在网上看到 这篇文章才明白 https://www.cnblogs....

奋斗的小牛
昨天
2
0
数据结构与算法3

要抓紧喽~~~~~~~放羊的孩纸回来喽 LowArray类和LowArrayApp类 程序将一个普通的Java数组封装在LowArray类中。类中的数组隐藏了起来,它是私有的,所以只有类自己的方法才能访问他。 LowArray...

沉迷于编程的小菜菜
昨天
1
0
spring boot应用测试框架介绍

一、spring boot应用测试存在的问题 官方提供的测试框架spring-boot-test-starter,虽然提供了很多功能(junit、spring test、assertj、hamcrest、mockito、jsonassert、jsonpath),但是在数...

yangjianzhou
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部