Python之斐波拉数列

在日常情况,可能会涉及到一个数据模型,就是前两个数字相加的所得之和,等于第三个数字,这里我们可以引用斐波拉数列数据模型;例如有如下数字

0,1,1,2,3,5,13,13,21,34,55,144,233,377,610

#打印出如上述数列,前两个数相加等于后面的数(这里做一个限制条件如果arg3>10,则返回arg3,否则就是一个无限制的循环)

#顶一个函数func

def func(arg1,arg2):
  if arg1 == 0:
    pass
  arg3 = arg1 + arg2
  if arg3 >10:
  return arg3
  func(arg2,arg3)
result = func(0,1)
print result

运行结果如下:

None

对上述代码进行剖析,我们先看如下代码:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = ‘ryan‘

def fun5():
    return 13
    
def fun4():
    fun5():
def fun3():
    fun4()
    
def fun2():
    fun3()
    
def fun1():
    fun2()
    
result =fun1()
print result

该代码是一个函数调用另外一个函数的例子,运行该代码,结果如下:

None

即result的结果为None,该代码中所有的地方都是函数,最后的定义是将函数func1()赋给变量result,输出变量为None时,说明函数func1没有返回值,或者定义返回值为None,由上述代码可以发现func1没有定义返回值None,所以默认返回None;所以对该代码解释如下:

当我们执行result=func1()时,func1就会执行如下代码:

def fun1():
   fun2()

当执行完def func1()就会执行func2(),而func2内容如下:

def fun2():
   fun3()

同样,当执行完def func2():就会再执行func3(),如果func2中有返回值,则此返回值就返回给调用它的函数func1

同样再去执行func3(),即:

def fun3():
   fun4()

接着执行func4(),即:

def fun4():
   fun5()

而函数func5代码如下:

def func5():

return 13

从以上代码可以发现,在func4()调用func5的时,func5会返回一个数字13,该值是函数func5的返回值,该返回值会赋给调用他的函数,这里调用func5的函数时func4,所以此时func4里的func5其实就是return 13 语句返回的结果,即13的结果,所以func4有一个数字13(返回值 13),即:

def func4():                            def func4():
   func5() ======================================>     13

此时的func4并没有返回值,所以实际代码为:

def func3():
   func4

故此次调用也就没有返回值,由于func3没有返回值,所以后面的func2调用也就没有返回值,所以上述最终结果为None

所以代码的实质为:

#!/usr/bin/env python
# -*- coding:utf-8 -*-

def fun5():
    return 13
    
def fun4():
    ret = fun5():
    #return None
#因为func4默认没有返回值,即返回值为None,所以13到达这一步就停止了继续传递了,

def fun3():
    fun4()
    #return None   
#此处func3获取func4的返回值None

def fun2():
    fun3()
    #return None
 
#此处func2获取func3的返回值None  

def fun1():
    fun2()
    #return None

#此处func1获取func2的返回值None   
#resut=func1(),即result等于func1的返回值None,所以输出None
result =fun1()
print result

要实现该代码返回值,只需要做如下修改即可:

#!/usr/bin/env python
# -*- coding:utf-8 -*-

def fun5():
    return 13
    
def fun4():
    ret = fun5():
    #return None
    return ret
#因为func4默认没有返回值,即返回值为None,所以13到达这一步就停止了继续传递了,

def fun3():
    return fun4()
    #return None   
#此处func3获取func4的返回值None

def fun2():
    return fun3()
    #return None
 
#此处func2获取func3的返回值None  

def fun1():
    retrun fun2()
    #return None

#此处func1获取func2的返回值None   
#resut=func1(),即result等于func1的返回值None,所以输出None
result =fun1()
print result

解释:func5有返回值13,在func4中我们赋给了变量ret = func5(),所以ret=13,然后在后面加一句return ret,这样func4返回值即return ret 返回结果,即13,而func3下调用的func4,所以只需要在func3下将func4()改为return func4()就可以实现func3有返回值,同样在func2下调整fun3()为return func3()是func2具备返回值,再最后的func1中将func2()改为return func2()这样func1就有返回值,该过程的实质就是讲func5中的return 13经过传递最终传递到func1,从而输出出来。所以运行以上代码结果为:

13

所以再回过头来看第一次的代码:

def func(arg1,arg2):
  if arg1 == 0:
    pass
  arg3 = arg1 + arg2
  if arg3 > 10:
    return arg3
  return func(arg2,arg3)
result = func(0,1)
print result

输出结果为:

13

解释:将0,1放进函数内进行执行:

arg1=0,arg2=1,arg3 = 0 + 1=1,

当执行到if语句时,就不会继续执行,因为此时的arg3<10,所以执行下面的func(arg2,arg3)语句此时func(arg2,arg3)为func(1,1),arg2=1,arg3=1,即func(1,1),arg3=1+1=2,arg3<10,

继续执行

func(arg2,arg3),arg2=1,arg3=2,即func(arg1=1,arg2=2),arg3=1+2=3,arg3<10,

继续执行

func(arg2,arg3),arg2=2,arg3=3,即func(arg1=2,arg2=3),arg3=arg1+arg2=2+3=5,arg3<10,

继续执行

func(arg2,arg3),arg2=3,arg3=5,即func(arg1=2,arg2=5),arg3 =arg1+arg2=3+5=8,arg3<10,

继续执行

func(arg2,arg3),arg2=5,arg3=13,即func(arg1=5,arg2=13),arg3=arg1+arg2=5+8=13,arg3>10,

此时返回arg3,即13,if语句成立后,运行return arg3,此时只是在arg3>10时作为本次调用结果返回,但是我们要求的本次返回的结果要返回给上一次调用,才可以正常输出否则结果显示为None,这里可以参考上面的fun1.....fun5函数的例子理解,所以在最后要有一次要将结果赋值给上次调用,这里可以将代码再做修改看下进行分析:

def func(arg1,arg2):
    if arg1 == 0:
        pass
    arg3 = arg1 +arg2
    #print arg3
    if arg3 >10:
        return arg3
    print arg3
    print "###########"
    return func(arg2,arg3)
result =func(0,1)
print result

运行结果:

1
###########
2
###########
3
###########
5
###########
8
###########
13

如果将return func(arg2,arg3)改为func(arg2,arg3)再看下运行结果:

def func(arg1,arg2):
    if arg1 == 0:
        pass
    arg3 = arg1 +arg2
    #print arg3
    if arg3 >10:
        return arg3
    print arg3
    print "###########"
    func(arg2,arg3)
result =func(0,1)
print result

运行结果:

1
###########
2
###########
3
###########
5
###########
8
###########
None

从这里可以看出当arg3<10的时候,都可以输出的arg3,而当arg3>10的时并没有arg3的值输出,其根本原因是没有将arg3返回给func函数体,即arg3的值就停留在return arg3这里,没有进一步传递,因为是递归调用,本次的返回值应该返回给上次调用的函数体本身,即func(arg),所以此时的返回值却停留在return arg3这里,所以返回值为默认值(即None),故这里应该在func(arg2,arg3)前面添加return

def func(arg1,arg2):
    if arg1 == 0:
        pass
    arg3 = arg1 +arg2
    #print arg3
    if arg3 >10:
        return arg3
    print arg3
    print "###########"
    return func(arg2,arg3)
result =func(0,1)
print result
时间: 2024-10-09 10:31:47

Python之斐波拉数列的相关文章

斐波拉契数列的python多种完美实现

强大,优雅,深入研究python后的重大发现.          让我们一起领略一下. 提到斐波拉契数列的实现,你可能首先会想到递归: def fibo(i): if i==0 or i==1: return 1 else: return fibo(i-1)+fibo(i-2) PS:递归有很多重复计算,比方说你计算f(5)时要去计算f(4)和f(3),而计算f(4)时又要去计算f(3),这样f(3)就重复计算了 完美实现方案一: 完美实现方案二: 完美实现方案三(参考python cookbo

斐波拉契数列(用JavaScript和Python实现)

1.用JavaScript 判断斐波拉契数列第n个数是多少 //需求:封装一个函数,求斐波那契数列的第n项 //斐波拉契数列 var n=parseInt(prompt("输入你想知道的斐波那契数列的第几位数")); document.write(f(n)); function f(n){ if (n>=3) { var a=1; var b=1; for(var i=3;i<=n;i++){ var temp=b; b=a+b ; a=temp; } return b;

Python——从连续赋值到斐波拉切数列

Python中有一个非常简洁的赋值语句用法,就是连续赋值. 要分别给两个变量赋值,我的第一念头是如下: 1 a = 1 2 b = 2 但其实python还提供了一种更简洁的写法如下 1 a , b = 1 , 2 这时我们很自然的就能理解为按顺序赋值,a = 首位数字1,b = 次位数字2.但实际上并不仅仅如此. 连续赋值语句中等式右边其实都是局部变量,而不是真正的变量值本身.当等号右边是定值时,这样做当然没有问题.但是如果右边是一个含有变量的表达式,那么赋值时会采用截至本句代码前一句为止,各

python迭代器实现斐波拉契求值

斐波那契数列(Fibonacci sequence),又称黄金分割数列,也称为"兔子数列":F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*).例如 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368........这个数列从第3项开始,每一项都等于前两项之和,而且当n趋向于无穷大时,前一项与后一项的

Fibonacci斐波拉契数列----------动态规划DP

n==10 20 30 40 50 46 体验一下,感受一下,运行时间 #include <stdio.h>int fib(int n){ if (n<=1)     return 1; else            return fib(n-1)+fib(n-2); }int main( ){ int n; scanf("%d",&n); printf("%d\n" ,fib(n) );} 先 n==10 20 30 40 50 46

青蛙跳台阶问题-斐波拉契数列

题目1:一个台阶总共有n级,如果一次可以跳1级,也可以跳2级.求总共有多少种跳法 首先我们考虑最简单的情况,加入只有1级台阶,那显然只有一种跳法,如果有2级台阶,那就有两种跳的方法了:一种是分两次跳,每次跳1级:另外一种就是一次跳2级 现在我们来讨论一般情况.我们把n级台阶时的跳法看成是n的函数,记为f(n).当n>2时,第一次跳的时候就有两种不同的选择:一是第一次只跳1级,此时跳法数目等于后面剩下的n-1级台阶的跳法数目,即为f(n-1):另外一种选择是第一次跳2级,此时跳法数目等于后面剩下的

浅谈C#中的斐波拉契数列

突然对那些有趣的数学类知识感兴趣了,然后就简单研究了一下斐波拉契数列,看看它的有趣之处! 斐波拉契数列(Fibonacci Sequence),又称黄金分割数列,该数列由意大利的数学家列奥纳多·斐波那契发现的.这种数列指的是这样一个数列:0.1.1.2.3.5.8.13.21. 34.--在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*). 用C#实现斐波拉契数列的代码: Console.Write("请输入一个长

在c#中编写斐波拉契数列程序

思路:首先因为输出的是一个数列,又因为不定长,所以要见一个集合来装数列,其次确定第一个数和第二个数都为1,然后根据斐波拉契数列的特点,确定是一个循环语句,再根据从第三位开始,每个数字都是前两个数的和的特点写出代码.代码如下: while(true){Console.Write("请输入斐波拉契数列的长度:");int len = int.Parse(Console.ReadLine());int[] array = new int[len];if (len < 3){Consol

斐波拉契数列的计算方法

面试题9.斐波拉契数列 题目: 输入整数n,求斐波拉契数列第n个数. 思路: 一.递归式算法: 利用f(n) = f(n-1) + f(n-2)的特性来进行递归,代码如下: 代码: long long Fib(unsigned int n) { if(n<=0) return 0; if(n==1) return 1; return Fib(n-1) + Fib(n-2); } 缺陷: 当n比较大时递归非常慢,因为递归过程中存在很多重复计算. 二.改进思路: 应该采用非递归算法,保存之前的计算结