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

 

posted @ 2017-08-04 09:49  耳木东木2  阅读(194)  评论(0编辑  收藏  举报