zoukankan      html  css  js  c++  java
  • Python练习题 021:递归方法求阶乘

    【Python练习题 021】 利用递归方法求5!。

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

    首先得弄清楚:5! 指的是“5的阶乘”,即 5! = 1*2*3*4*5。

    然后呢,据说,“递归”就是对自身进行调用的函数。听着挺奇怪,反正先依葫芦画瓢,写代码如下:

    def f(x):
        if x == 0:
            return 0
        elif x == 1:
            return 1
        else:
            return (x * f(x-1))
    print(f(5))
    

    大概意思是说:如果 x=5,那么就返回 5*f(4) 的值。而想知道这个值,就得先算出 f(4) 等于多少。根据函数 f(x),f(4) = 4*f(3),所以 f(5) = 5*4*f(3)。以此类推,推到 f(5) = 5*4*3*2*f(1)。函数 f(x) 说了,当 x==1 时,返回值为 1。所以:f(5) = 5*4*3*2*1 = 120。所以,输出结果如下:

    120

    听起来好像很麻烦,感觉不好理解。如果不用递归函数呢?用最基本的代码,可以写成:

    f = 1
    for i in range(1,6):
        f = f * i
    print(f)
    

    结果一样是120。

    都说递归函数代码简洁、逻辑清晰。就这题而言……有吗?

    【2016-10-18 更新】-----------------------------------------

    在【Python练习题 021:累积累加】这一题中学到了 functools.reduce() 和 lambda,甚是好用,用来算阶乘更是得心应手。试解本题如下:

    import functools
    print(functools.reduce(lambda x,y:x*y, range(1,6)))
    

    看,2行就搞定了,真爽!关于 functools.reduce() 和 lambda,请参见【Python练习题 021:累积累加】。

    而感谢 codegay,我不但又学了一种新解法,还学到了 operator.mul(a, b) 新技能!先看代码:

    import functools, operator
    print(functools.reduce(operator.mul, range(1,6)))
    

    这种解法其实与前例使用 lambda 的思路是一样的,只不过利用 operator.mul(用于计算 a*b) 代替 functools.reduce() 所需的函数部分,却也十分简洁明了,赞!

    ++++++++++++++++++++++++++++++++++++++

    题目出处:编程语言入门经典100例【Python版】

  • 相关阅读:
    OpenStack源码系列---neutron-server
    理解全虚拟、半虚拟以及硬件辅助的虚拟化
    QEMU+GDB调试方法
    SQL Server故障转移集群
    OpenStack源码系列---nova-conductor
    mysql 安装和基本使用
    数据库原理
    linux 计划任务
    linux 进程管理和内存分配

  • 原文地址:https://www.cnblogs.com/iderek/p/5969992.html
Copyright © 2011-2022 走看看