zoukankan      html  css  js  c++  java
  • python:递归函数

    在函数内部我们可以调用其它函数如:

    def say(great):
        return great
    
    def person(name):
        print(say("Hello"), name)
    
    person("珊迪 奇克斯")

    打印如下:

     >>> Hello 珊迪 奇克斯

    但如果我们调用自身,这个函数就是递归函数

    举个例子,我们来计算阶乘 n! = 1 x 2 x 3 x ... x n(比如5的阶乘:5*4*3*2*1)用函数fact(n)表示可以看出:

    fact(n) = n! = 1x  2 x  3 x .....x (n - 1) x n = (n - 1) ! x n = fact(n - 1) * n

    所以,fact(n)可以表示n * fact(n - 1),只有n = 1时需要特殊处理。(否则1*fact(1 - 1) =0没有意义)

    于是,fact(n) 用递归的方式写出来就是:

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

    上面就是一个递归函数,我们把它写成一个功能方便我们演示结果

    detail = input("阶乘计算器: 九九参考计算器 按任意键继续
    
    ")
    
    def face(n):
        if n == 1:
            return 1
        return n * face(n - 1)
    
    while True:
        num = int(input("输入数值你想找到的阶乘:"))
        print("阶乘结果是:",face(num))
        print("---------------------")

    这样我们就可以演示我们写的阶乘计算器程序了!

    如果我们计算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


    递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。如下面用循环实现阶乘
    def fate(max_num):
        temp = 1
        for i in range(1,max_num + 1):
            temp = temp * i
        print(temp)
    
    fate(5)

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

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

    >>> fact(1000)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 4, in fact
      ...
      File "<stdin>", line 4, in fact
    RuntimeError: maximum recursion depth exceeded in comparison


  • 相关阅读:
    视频编码之释——从H.261 到H.264
    bitmap图像介绍
    用搜索引擎搜索我的名字 @_@
    blog标题由来
    ORACLE双机热备安装及物理迁移 for win2000
    审核再次失败
    asp.net学习历程
    痛并快乐着
    开心,blog点击率超过1000
    XP下ASP.NET不能访问ORACLE数据库的解决方案
  • 原文地址:https://www.cnblogs.com/qjuly/p/9209296.html
Copyright © 2011-2022 走看看