1.递归函数

定义:自己调用自己的函数
:
:
有去有回是递归
#(1)简单的递归函数
def digui(n):
    print(n)
    if n > 0:
        digui(n-1)
    print(n)

digui(5)
'''
代码解析:
去的过程:
n = 5
print(5) 5>0 digui(5-1) => digui(4) 执行到第12行,自己调用自己,代码暂定在12行,发生阻塞
print(4) 4>0 digui(4-1) => digui(3) 执行到第12行,自己调用自己,代码暂定在12行,发生阻塞
print(3) 3>0 digui(3-1) => digui(2) 执行到第12行,自己调用自己,代码暂定在12行,发生阻塞
print(2) 2>0 digui(2-1) => digui(1) 执行到第12行,自己调用自己,代码暂定在12行,发生阻塞
print(1) 1>0 digui(1-1) => digui(0) 执行到第12行,自己调用自己,代码暂定在12行,发生阻塞
print(0) 0>0? 条件不满足,代码向下执行,
print(0)
如果函数执行到最后一行调用结束,要触底反弹,回到上一层函数调用处
回的过程:
print(1) 回到函数为1的第12行 代码继续向下执行, print(1)
print(2) 回到函数为1的第12行 代码继续向下执行, print(2)
print(3) 回到函数为1的第12行 代码继续向下执行, print(3)
print(4) 回到函数为1的第12行 代码继续向下执行, print(4)
print(5) 回到函数为1的第12行 代码继续向下执行, print(5)
5,4,3,2,1,0,0,1,2,3,4,5

栈帧空间: 负责运行函数而开辟的空间
(1)递归函数整体过程,调用一层函数就是开辟一层栈帧空间,结束一层函数,就是释放一层栈帧空间,
递归函数实际上就是开辟和释放栈帧空间的过程
(2)递归函数回的过程:如果函数走到最后一层执行结束了,要回到上一层空间函数调用处,继续向下执行,直到所有代码执行完毕,
在触发触底反弹操作,回到上一层空间函数调用处,以此类推...
直到所有的函数全都释放掉,那么这个递归函数彻底终止.
(3)写递归函数的时候切记要加上一个终止的条件,否则会发生内存溢出,如果层数不多,不推荐使用递归

递归函数通过两个条件触发回的过程:
(1)当前函数彻底执行完毕的时候,触发回的过程,回到上一层函数的调用处
(2)当前函数遇到return 返回值的时,触发回的过程,回到上一层函数的调用处
#计算任意数n的阶乘
#5! 5*4*3*2*1
#8! 8*7*6*5*4*3*2*1
#普通方法
n = 5
total = 1
for i in range(1,n+1):
    total *= i
print(total)

#递归方法
def jiecheng():
    if n <= 1:
        return 1
    return n * jiecheng(n-1)

#jiecheng(1) =>1
'''
代码解析:
去的过程:
n = 5 return 5 * jiecheng(5-1) => 5 * jiecheng(4)
n = 4 return 4 * jiecheng(4-1) => 4 * jiecheng(3)
n = 3 return 3 * jiecheng(3-1) => 3 * jiecheng(2)
n = 2 return 2 * jiecheng(2-1) => 2 * jiecheng(1)
n = 1 return 1

回的过程:
n = 2 return 2 * jiecheng(2-1) => 2*1
n = 3 return 3 * jiechneg(3-1) => 3*2*1
n = 4 return 4 * jiecheng(4-1) => 4*3*2*1
n = 5 return 5 * jiecheng(5-1) =>5*4*3*2*1

res = 5 * 4 * 3 * 2 * 1 = 120

2.尾递归

#尾递归:只返回递归函数本身且非表达式(没有运算(+,-,*,/..))

只开辟一个栈帧空间完成递归函数(因为最终的返回值就是第一层空间的返回值,所以只需要一层栈帧空间即可,不停的进行替换)
cpython解释器不支持,可以换一个支持尾递归的解释器(比如在公司内部大型服务器架构的解释器 推荐使用)
#方法一:
def jiecheng2(n,endval=1):
    if n <= 1:
        return endval
    return jiecheng2(n-1,n*endval)
res = jiecheng2(5,1)
print(res)

'''
#去的过程
n = 5 endval=1
    return jiecheng(5-1,5*1) => jiecheng(4,5*1)
n = 4 endval = 5 * 1
    return jiecheng(4-1,4* 5*1) =>jiecheng(3,4*5*1)
 n=3 endval = 4*5*1
   return jiecheng(3-1,3* 4*5*1) => jiecheng(2, 3*4*5*1)
n=2 endval = 3*4*5*1
   return jiecheng(2-1,2* 3*4*5*1) => jiecheng(1, 2*3*4*5*1)
n=1 endval = 2*3*4*5*1
   n < = 1 这个条件满足了,直接返回endval

#回的过程
n = 2 endval = 3*4*5*1
    return jiecheng(2-1,2* 3*4*5*1) => 2*3*4*5*1
n = 3 endval = 4*5*1
    return jiecheng(3-1,3* 4*5*1)   => 2*3*4*5*1
n = 4 endval = 5*1
    return jiecheng(4-1,4 *5*1) => 2*3*4*5*1
n = 5 endval = 1
     return jiecheng(5-1,5*1) => 2*3*4*5*1

如果运行到最后一层函数,有返回值了,那么这个返回值就是最终的值,
所有尾递归只需要一层栈帧空间
'''
#方法二 优化版
#系统底层用
def jiecehng2(n,endval):
    if n<=1:
        return endval
    return jiecehng2(n-1,n*endval)
#给用户用 不需要用户填写第二个参数(比较人性化)
def jiecheng3(n):
    return jiecehng2(n,1)
res = jiecheng3(5)
print(res)

3.斐波那契序列

# 1 1 2 3 5 8 13 21 34 55
#第n个数 它的数值是多少?
#除了前2个,后面每一个值都是上一个数 + 上上的数两者之和
def fib(n):
    if n == 1 or n == 2:
        return 1

    return fib(n-1) + fib(n-2)
res = fib(45)
print(res)

'''
代码解析:
n = 5
=> return fib(5-1) + fib(5-2)
=> return fib(4)  + fib(3) => 3 + 2 => 5
fib(4) => 3
fib(3)    +      fib(2)  = 2   + 1
fib(2) + fib(1) = 1 + 1
2+1 = 3

fib(3) => 2
fib(2)  + fib(1)
1 + 1 = 2
'''

Python 基础之递归 递归函数 尾递归 斐波那契的更多相关文章

  1. Python3基础 函数 递归 阶乘与斐波那契数列

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  2. Python进阶(七)----带参数的装饰器,多个装饰器修饰同一个函数和递归简单案例(斐波那契数列)

    Python进阶(七)----带参数的装饰器,多个装饰器修饰同一个函数和递归简单案例(斐波那契数列) 一丶带参数的装饰器 def wrapper_out(pt): def wrapper(func): ...

  3. 算法 递归 迭代 动态规划 斐波那契数列 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  4. Python递归函数与斐波那契数列

    定义:在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. 阶乘实例 n = int(input(">>:")) def f(n): s ...

  5. Python开发【算法】:斐波那契数列两种时间复杂度

    斐波那契数列 概述: 斐波那契数列,又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.34.……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1, ...

  6. Python初学者笔记:打印出斐波那契数列的前10项

    问题:斐波那契数列(意大利语: Successione di Fibonacci),又称黄金分割数列.费波那西数列.费波拿契数.费氏数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.- ...

  7. Count and Say,统计并输出,利用递归,和斐波那契数列原理一样。

    问题描述:n=1,返回“1”:n=2,返回“11”:n=3,返回“21”:n=4,返回1211,.... 算法分析:和斐波那契数列道理差不多,都是后一个要依赖前一个元素.因此可以使用递归,也可以使用迭 ...

  8. 关于JS递归函数求斐波那契数列两种实现方法

    百度已经解释的很详细了,但是不写注释还真是看不懂,递归,就直接套公式了,for循坏,我们就用EXCEL看一下规律 可以看到B是A+B的和,A往后就是B的值,所以我们需要第三个变量来保存他们的和,取出B ...

  9. 剑指offer 7. 递归和循环 斐波那契数列

    题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). n<=39 简简单单 废话不多说,直接上代码: public class Sol ...

随机推荐

  1. socketserver模块(实现并发)

    socketserver模块(实现并发) 一.基于UDP协议实现的并发 # 服务端 import socketserver class MyServer(socketserver.BaseReques ...

  2. java中路径的问题

    在java中,涉及路径的问题有很多,不管在windows还是linux系统中,不要纠结”/“分隔符的使用,在windows系统中,资源加载器会自动的将”/“转换成”\“. 在java中获取资源的方式有 ...

  3. MySQL 5.5.62 安装方法(标准配置版)

    1.此安装方法适用于绝大多数MySQL版本,首先在MySQL官网上下载好所需版本. 2.(官网可能不太好找)在我的博客列表中有一篇是MySQL官网下载链接,直达下载界面,方便. 3.下载.(安装版  ...

  4. ajax中 踩过的坑

    直接上图:  以前一直对  dataType  这个参数  模棱两可,只知道一般写的是 json 正解:这个dateType  指的是 ajax  返回数据的格式.比如:你想返回一个“success& ...

  5. firefox插件hostadmin自由切换host

    在Mac下firefox插件hostadmin切换host,遇到的第一个问题就是提示权限不足,解决办法,在终端输入以下命令即可: sudo chmod og+w /etc/hosts chmod修改权 ...

  6. SQL按照某一列数据去重并显示整行信息

    mysql按照某一字段去重,并显示其他字段信息.有时候会有一些这样的需求,就是按照sql中的某一列值去重,还要显示其他字段的信息.用distinct进行去重时不能显示整行的信息,对这种需求显然难以满足 ...

  7. js中this,箭头函数和普通函数

    四种基本用法 1. 一般方法中,this代指全局对象 window 2. 作为对象方法调用,this代指当前对象 3. 作为构造函数调用,this 指代new 出的对象 function test() ...

  8. 实现一个简易的Unity网络同步引擎——netgo

    实现一个简易的Unity网络同步引擎Netgo 目前GOLANG有大行其道的趋势,尤其是在网络编程方面.因为和c/c++比较起来,虽然GC占用了一部分机器性能,但是出错概率小了,开发效率大大提升,而且 ...

  9. Wordpress-微信机器人高级版

    微信机器人高级版是我爱水煮鱼开发的一款插件,功能很棒,运行此插件需要同时开启WPJAM Basic插件. 高级版5.0 版本对服务器要求非常高,只支持 Linux 服务器,PHP 要求 7.2 及以上 ...

  10. POJ 3987 Computer Virus on Planet Pandora (AC自动机优化)

    题意 问一个字符串中包含多少种模式串,该字符串的反向串包含也算. 思路 解析一下字符串,简单. 建自动机的时候,通过fail指针建立trie图.这样跑图的时候不再跳fail指针,相当于就是放弃了fai ...