zoukankan      html  css  js  c++  java
  • python3--递归

    递归

    利用函数编写如下数列:
    斐波那契数列,简单地说,起始两项为0和1,此后的项分别为它的前两项之后。
    它是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368

    实现方式一:
    根据这一特性,可采用最简单的方法计算该项,循环计算每项的值,以下为Python实现代码,输出该数列的前num项

    def fibo(num):
        a = 0
        b = 1
        i = 0
    
        while i < num:
            print(a)
            a, b = b, a + b
            i += 1
    
    fibo(10)
    

    执行结果:

    0
    1
    1
    2
    3
    5
    8
    13
    21
    34
    

    实现方式二: 
    考虑到从第三项开始,每一项的值都为前面两项的和,可以使用递归的方法来计算:

    # Filename : test.py
    # author by : 阿木
    
    def recur_fibo(n):
       """递归函数
       输出斐波那契数列"""
       if n <= 1:
           return n
       else:
           return(recur_fibo(n-1) + recur_fibo(n-2))
    
    
    # 获取用户输入
    nterms = int(input("您要输出几项? "))
    
    # 检查输入的数字是否正确
    if nterms <= 0:
       print("输入正数")
    else:
       print("斐波那契数列:")
       for i in range(nterms):
           print(recur_fibo(i))
    

    执行以上代码输出结果为:

    您要输出几项? 10
    斐波那契数列:
    0
    1
    1
    2
    3
    5
    8
    13
    21
    34

    实现方式三:
    以上采用的是递归的实现方式,相比较而言,使用迭代会更加高效,以下函数会返回一个列表:

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    
    def fibo(num):
        numList = [0,1]
    
        for i in range(num - 2):
            numList.append(numList[-2] + numList[-1])
        return numList
    
    print(fibo(10))
    

    执行以上代码输出结果为:

    [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
    

    另外一种方式如下,该函数只返回某一项:

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    
    def fibo(num):
        x,y,n = 0,1,num
    
        while n:
            print(x)
            x,y,n = y, x + y, n - 1
    
        return x
    
    print(fibo(10))
    

    执行以上代码输出结果为:

    0
    1
    1
    2
    3
    5
    8
    13
    21
    34
    55
    

    实现方式四: 
    采用尾递归的方式来编写

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    
    def fibo(num):
    
        def fiboIter(num,x,y):
            print(x)
            if num <= 0:
                return x
            else:
                return fiboIter(num - 1, y, x + y)
    
        return fiboIter(num, 0, 1)
    
    print(fibo(10))
    

    执行以上代码输出结果:

    0
    1
    1
    2
    3
    5
    8
    13
    21
    34
    55
    55
    
  • 相关阅读:
    【转】 矩阵构造方法
    CODEVS1187 Xor最大路径 (Trie树)
    POJ2001 Shortest Prefixes (Trie树)
    CODEVS1079 回家 (最短路)
    CODEVS2144 砝码称重2 (哈希表)
    CODEVS1380 没有上司的舞会 (树形DP)
    JAVA 多态和异常处理作业——动手动脑以及课后实验性问题
    再读大道之简第七章第八章
    JAVA 接口与继承作业——动手动脑以及课后实验性问题
    再读大道至简第六章
  • 原文地址:https://www.cnblogs.com/chenlin163/p/7283407.html
Copyright © 2011-2022 走看看