zoukankan      html  css  js  c++  java
  • Python递归和迭代

    递归

    在函数内部,调用函数自身的编程技巧称为递归( recursion)。递归函数结构清晰,很直观的理解计算过程,但也有严重缺点:相对于普通循环而言,递归运行效率较低,经过很多冗余的计算,递归会消耗大量的调用堆栈。在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧。每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,递归调用的次数过多,会导致栈溢出。因此,应该尽量用循环代替递归。

    举个阶乘的例子,用函数 ca(n) 表示阶乘,ca(n) = n! = 1 * 2 * 3 * 4 * (n-1 ) * n = n * ca(n-1)

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

    函数的计算过程是这样的:

    (ca(5))
    
    (4 * ca(5))
    
    (3 * (4 * ca(5)))
    
    (2 * (3 * (4 * ca(5))))
    
    (1 * (2 * (3 * (4 * (5)))))

    迭代

    利用 for 循环来遍历一个列表(list)或元组(tuple),将值依次取出,这种方法我们称为迭代。

    for x in range(10):
        print x

    我们可以用 for 循环类计算阶乘:

    m = 1
    for x in range(1,10):
        m *= x
    >>> print m
    >>> 3628800

    可以用函数来更加人性化阶乘:

    def factorial(x,y):
        m = 0
        if x > 0:
            for n in (x,y+1):
                m *= n
        return m
    print factorial(1,10)

    Python还提供一个 reduce 函数,利用 lambda 匿名函数,一行代码便可以完成阶乘的计算:

    print reduce(lambda x,y: x*y, range(1,11))

      

  • 相关阅读:
    CGI与FastCGI
    Google Protocol Buffer 的使用和原理
    AMQP协议
    Java 多线程 并发编程
    深入理解HashMap
    Bitmap 位图
    Bloom Filter概念和原理
    BloomFilter–大规模数据处理利器
    java bitmap/bitvector的分析和应用
    Linux iptables 备忘
  • 原文地址:https://www.cnblogs.com/zhanhg/p/4375248.html
Copyright © 2011-2022 走看看