Python3学习笔记(2)——递归函数

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

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

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

解决递归调用栈溢出的方法是通过尾递归优化,事实上尾递归和循环的效果是一样的,所以,把循环看成是一种特殊的尾递归函数也是可以的。

尾递归是指,在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况。

尾递归调用时,如果做了优化,栈不会增长,因此,无论多少次调用也不会导致栈溢出。

遗憾的是,大多数编程语言没有针对尾递归做优化,Python解释器也没有做优化,所以,即使把上面的fact(n)函数改成尾递归方式,也会导致栈溢出。

小结

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

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

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

时间: 2024-10-05 06:05:32

Python3学习笔记(2)——递归函数的相关文章

Python3学习笔记(urllib模块的使用)转http://www.cnblogs.com/Lands-ljk/p/5447127.html

Python3学习笔记(urllib模块的使用) 1.基本方法 urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None) -         url:  需要打开的网址 -         data:Post提交的数据 -         timeout:设置网站的访问超时时间 直接用urllib.request模块的urlopen()

python3学习笔记(1)

#python学习笔记 17/07/07# !/usr/bin/evn python3# -*- coding:utf-8 -*- #r"" 引号当中的字符串不转义 #练习#打印 '\\\t\n'print(r'\\\t\n') #打印 n = 123print('n = 123') # 打印 f = 456.789print("f = 456.789") #打印 s1 = 'Hello, world!'print("s1 = 'Hello, world!

python3学习笔记(3)

一.内置函数补充1.callable()检测传递的参数是否可以被调用.def f1() pass可以被调用 f2 = 123不可以被调用 2.chr()和ord()chr()将ascii码转换成字符,ord()将字符转换成acsii码在2.7中chr()和ord()用来翻译参数和ascii码的对应关系.例:r = chr(65)print(r)和r = ord("B")print(r) 实例:随机验证码import random #用来生成随机数的模块li = []for i in r

python3学习笔记(0)

一.编程语言主要从以下几个角度分类:1.编译型和解释型2.静态语言和动态语言3.强类型定义语言和弱类型定义语言 编译型:程序运行前先由负责翻译的程序将代码转换成可执行代码进行执行.例如C/C++.Pascal/Delphi.VB.其优点为运行速度快,对系统要求低,适用于开发操作系统.大型应用程序.数据库系统等.解释型:程序运行时每直行到一条指令就由解释程序将所执行到的代码转换成可执行代码进行执行,如此反复,直至程序直行完毕.例如Java.JavaScript.VBScript.Perl.Pyth

python3学习笔记(2)

一.面向对象(初识)由类和方法组成,类里面封装了很多功能,根据这个类,可以创建一个这个类的对象,即对象是根据这个类创建的,以后这个对象要使用某个功能的时候就从这个类里面的找.例:str -功能一 -功能二 -功能三 -... s1 = 'alex'str即是类,s1即是根据这个类创建的一个对象. 二.set集合set是一个无序.不重复.可嵌套的集合. 1.语法:se = {}或se = set()或se = set((11,22,33,33)),set()时其实是调用这个类里面的__init__

Python3学习笔记:使用代理访问url地址

#! /usr/bin/env python3 # -*- coding:utf-8 -*- 'python进行代理的curl数据提交' __author__ = 'ken' import os; import sys; curPath = os.path.abspath(os.path.dirname(__file__)); sys.path.append(curPath); import urllib.request; import urllib.parse; import socket;

python3学习笔记(3)_dict-set

1 # !/usr/bin/env python3 2 # -*- coding:utf8 -*- 3 4 #dict 和 set 5 #dict dictionary 用于存放 键值对的, 无序,key 不可变 6 #姓名 年龄的字典 7 d = {"hanmeimei":21, "lilei":23, "jim":23} 8 print(d) 9 #通过 键(hanmeimei) 取到 值 21 10 print(d['hanmeimei']

Python3学习笔记和心得(二)

数据类型 一.数字(int) Python可以处理任意大小的正负整数,但是实际中跟我们计算机的内存有关,在32位机器上,整数的位数为32位,取值范围为 -2**31-2**31-1,在64位系统上,整数的位数为64位,取值范围为-2**63-2**63-1.对于int类型,需要掌握的方法不多,看 下面的几个例子: 1 2 3 4 5 6 a=4 print(a.bit_length()) # 4在二进制中可以用最少3位 100 来表示4,所以输出3 print(int('4'))       #

python3学习笔记--001--python HelloWorld

python默认使用UTF-8编码 一个python3版本的HelloWorld代码如下: #!/usr/bin/env python print ('Hello World!') 如果此python脚本文件名为:hello.py,则运行此脚本文件的方法有两种: 1.python hello.py [[email protected] python]$ python hello.py Hello World! [[email protected] python]$ 2.修改hello.py的权限