最直接的思路,是写递归方法
循环方法的稍微有点绕,我觉得问题主要是出在,总结循环的通项公式更麻烦,难在数学上。
- ####------递归版fib--------------####
- def fib1(x):
- if x==0:
- return 1
- if x==1:
- return 1
- else:
- return fib1(x-1)+fib1(x-2)
-
- print(fib1(5))
- print()
-
- for i in range(6):
- print(fib1(i))
- print()
- ####------循环版fib--------------####
-
- def fib2(x):
- sum1=1
- sum2=1
- for i in range(x):
- if i==0:
- sum=1
- if i==1:
- sum=1
- elif i>1:
- sum=sum1+sum2
- sum1=sum2
- sum2=sum
- return sum
-
-
- print(fib2(6))
- print()
- ####------循环版fib--------------####
-
- def fib2(x):
- sum1=1
- sum2=1
- for i in range(x):
- if i==0:
- sum=1
- if i==1:
- sum=1
- elif i>1:
- sum=sum1+sum2
- sum1=sum2
- sum2=sum
- return sum
-
-
- print(fib2(6))
- print()
-
-
- for i in range(6):
- print(fib2(i))
- print()
-
开始我并没有发现
后面发现删除这段代码就不报错
for i in range(6):
print(fib2(i))
print()
UnboundLocalError: cannot access local variable 'sum' where it is not associ
报错解释:
UnboundLocalError 指的是在函数内部尝试访问一个还没有赋值的局部变量。在 Python 中,如果你在函数内部给一个变量赋值了,它就会被视为一个局部变量,除非明确地声明它是全局变量。如果你在赋值之前就尝试访问它,就会引发 UnboundLocalError。
报错原因可能是你在给变量 sum 赋值之前就尝试使用它,或者你的函数内部有一个 sum() 内置函数的调用,导致名称冲突。
- ####------循环版fib,详细打点--------------####
- def fib3(x):
- #sum=0 #为啥详细版的这里不设 sum=0 不报错呢?
- sum1=1
- sum2=1
- for i in range(x):
- print("for循环第", i+1 ,"轮开始")
- if i==0:
- sum=1
- if i==1:
- sum=1
- #sum3=sum1+sum2
- #sum4=sum3+sum2
- #sum5=sum4+sum3
- #从这些公式里抽象出循环的,变换规律,抽象出通用公式+(先)辅助的值变换公式
- elif i>1: #直接用 esle居然不行,必须判断 elseif i>1
- print("sum1=",sum1)
- print("sum2=",sum2)
- sum=sum1+sum2
- print("sum=",sum)
- sum1=sum2 #和下面那句顺序不能反
- sum2=sum
- print("sum1=",sum1)
- print("sum2=",sum2)
- print("sum=",sum)
- print("for循环第", i+1 ,"轮结束")
- print()
- return sum
-
- print(fib3(6))
- print()
if i==0:
sum=1
if i==1:
sum=1
sum3=sum1+sum2
sum4=sum3+sum2
sum5=sum4+sum3
因此,联立这3个方程就可以了
- S(n) = S(n-1)+ S(n-2)
- S(n-1)=S(n)
- S(n-2)=S(n-1)
for i in range(x):
if i==0:
sum=1
if i==1:
sum=1
elif i>1:
sum=sum1+sum2
sum1=sum2
sum2=sum