reference:递归函数

Note

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

eg.计算阶乘:

#!/usr/bin/env python3

def my_func(n) :
if n == 1 :
return 1
return n * my_func(n-1)

output:

>>> from function4 import my_func

>>> my_func(1)
1 >>> my_func(2)
2 >>> my_func(3)
6 >>> my_func(4)
24 >>> my_func(5)
120 >>> my_func(10)
3628800

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

func(5)的计算过程:

===> func(5)
===> 5 * func(4)
===> 5 * (4 * func(3))
===> 5 * (4 * (3 * func(2)))
===> 5 * (4 * (3 * (2 * func(1))))
===> 5 * (4 * (3 * (2 * 1)))
===> 5 * (4 * (3 * 2))
===> 5 * (4 * 6)
===> 5 * 24
===> 120

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

eg. my_func(1000)

output:

  File "/Users/wasdns/Desktop/Python-Learning/function/function4.py", line 4, in my_func
if n == 1 :
RecursionError: maximum recursion depth exceeded in comparison

3.解决递归调用栈溢出的方法是进行尾递归优化:

尾递归是指:1.在函数返回的时候,调用自身本身;2.return语句不能包含表达式。

这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况。

也就是说,尾递归优化重复调用一个帧栈,节省了大量运行时栈空间。

eg.

def my_func_2(num, product) :
if num == 1 :
return product
return my_func_2(num-1, num*product)

output:

>>> my_func_2(5, 1)
120

计算过程:

===> func_2(5, 1)
===> func_2(4, 5)
===> func_2(3, 20)
===> func_2(2, 60)
===> func_2(1, 120)
===> 120

练习

Hanoi Tower解法请参考:Hanoi Tower

抽象步骤:

1.将A柱中n-1个柱子搬到B柱。

2.将A柱中第n个柱子搬到C柱。

3.将A柱视作B柱,B柱视作A柱,重复上述两个步骤。

一个思考问题的关键是,忽略细节。在思考的时候,需要把函数视作一个整体功能,即将n个盘子从a移动到b,忽略其细节对于思考是一件很重要的事情。

def move(n, a, b, c) :
if (n == 1) : # A move last one to C
print(a, '=>', c)
return
else :
move(n-1, a, c, b) # from A move n-1 to B
move(1, a, b, c) # A move last one to C
move(n-1, b, a, c) # from B move n-1 to C
>>> move(3, 'A', 'B', 'C')
A => C
A => B
C => B
A => C
B => A
B => C
A => C

2017/2/3

Python学习札记(十四) Function4 递归函数 & Hanoi Tower的更多相关文章

  1. Python学习札记(十二) Function3 函数参数一

    参考:函数参数 Note 1.Python的函数定义非常简单,但灵活度却非常大.除了正常定义的必选参数外,还可以使用默认参数.可变参数和关键字参数,使得函数定义出来的接口,不但能处理复杂的参数,还可以 ...

  2. Python 学习 第十四篇:命名元组

    Python的元组不能为元组内部的数据进行命名,而 collections.namedtuple 可以来构造一个含有字段名称的元组类,命名元组可以通过逗号+字段名来获取元素值: collections ...

  3. Python学习(十四) —— 并发编程

    一.进程的概念 进程即正在执行的一个过程,进程是对正在运行的程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念.操作系统的其它所有内容都是围绕进程的概念展开的. #必备的理论基础 #一 ...

  4. Python学习札记(十五) 高级特性1 切片

    参考: 高级特性 切片 Note 1.掌握了Python的基础语法之后,就可以写出很多很有用的程序了,比如打印1-90的奇数: #!/usr/bin/env python3 L = [] n = 1 ...

  5. python 学习笔记十四 jQuery案例详解(进阶篇)

    1.选择器和筛选器 案例1 <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...

  6. python学习第十四天 -面向对象编程基础

    python也是支持面向对象编程的.这一章节主要讲一些python面向对象编程的一些基础. 什么是面向对象的编程? 1.面向对象编程是一种程序设计范式 2.把程序看做不同对象的相互调用 3.对现实世界 ...

  7. python学习笔记(十 四)、web.py

    使用web.py 通过python进行网页的编写,下面我们来简单了解一哈web.py 的使用 1 url处理 使用特定的url结构来解析我们发送的请求.如下面所示: urls = ( '/login' ...

  8. Python学习第十四篇——类初步使用及面向对象思想

    class Restaurant(): def __init__(self,restaurant_name,cuisine_type): self.name = restaurant_name sel ...

  9. python学习笔记十四:wxPython Demo

    一.简介 wxPython是Python语言的一套优秀的GUI图形库,允许Python程序员很方便的创建完整的.功能键全的GUI用户界面. wxPython是作为优秀的跨平台GUI库wxWidgets ...

随机推荐

  1. 【转】spring boot application.properties 配置参数详情

    multipart multipart.enabled 开启上传支持(默认:true) multipart.file-size-threshold: 大于该值的文件会被写到磁盘上 multipart. ...

  2. java中 synchronized 的使用,确保异步执行某一段代码。

    最近看了个有关访问网络url和下载的例子,里面有几个synchronized的地方,系统学习下,以下内容很重要,记下来. Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一 ...

  3. java基础06 switch

    public class SwitchDemo01 { /** * 韩嫣参加计算机编程大赛 如果获得第一名,将参加麻省理工大学组织的1个月夏令营 如果获得第二名,将奖励惠普笔记本电脑一部 如果获得第三 ...

  4. 深入浅出地,彻彻底底地理解python中的编码

    python处理文本的功能非常强大,但是如果是初学者,没有搞清楚python中的编码机制,也经常会遇到乱码或者decode error.本文的目的是简明扼要地说明python的编码机制,并给出一些建议 ...

  5. 大量高清文字版PDF编程书籍下载

    下载地址 :http://zhaojucai.com/download.html 文件夹: 数学之美(第二版) Java编程思想(第4版) 图灵程序设计丛书:Python基础教程(第2版)(修订版) ...

  6. Jenkins+Ant+Jmeter自动化测试平台

            持续集成 持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成.每次集成都通过自动化的构建(包括编译,发布,自动 ...

  7. H5移动端的一些坑、、、

    H5项目常见问题及注意事项 Meta基础知识: H5页面窗口自动调整到设备宽度,并禁止用户缩放页面 //一.HTML页面结构 <meta name="viewport" co ...

  8. 修改WordPress标签云字体大小颜色及标签显示数量

    WordPress 自带的标签云是一个很实用的小工具.站长可以通过标签对具有相同关健词的文章进行检索分类,利于访客查找相关文章.WordPress 默认标签云的字体最小为8pt,最大为22pt,标签显 ...

  9. JS传参中文乱码问题.NET

    前台js代码 window.location.href = "/product.aspx?id=2&title=" +encodeURIComponent(strtitle ...

  10. ruby中的链式访问和方法嵌套

    先看一道题,这道题是codewars上的一道题,我很早就看到了,但是不会写.等到又看到这道题的时候,我刚看完元编程那本书,觉得是可以搞定它的时候了.废话不多说,先看这道题,题目最开始是为JavaScr ...