网站服务器怎么优化,企业所得税怎么算案例,注册一个空壳公司需要多少费用,口碑好的网站推广价格问题#xff1a; fibonacci 斐波拉契数列#xff0c;用递归和循环的方法分别写,比较递归和循环的思路和写法的差别
最直接的思路#xff0c;是写递归方法
循环方法的稍微有点绕#xff0c;我觉得问题主要是出在#xff0c;总结循环的通项公式更麻烦#xff0c;难在数学…问题 fibonacci 斐波拉契数列用递归和循环的方法分别写,比较递归和循环的思路和写法的差别
最直接的思路是写递归方法
循环方法的稍微有点绕我觉得问题主要是出在总结循环的通项公式更麻烦难在数学上。 1 python写的递归如下
1.1 py代码
####------递归版fib--------------####
def fib1(x):if x0:return 1if x1:return 1else:return fib1(x-1)fib1(x-2)print(fib1(5))
print()for i in range(6):print(fib1(i))
print() 1.2 总结写这个fibo数列的递归的难点
最核心的先要总结递归规律这个fibo的递归规律很简单就是 f(x)f(x-1)f(x-2), 这个也是通项公式fibo的这个规律狠清晰不难 2 python写的循环版本
2.1 py代码循环版本
####------循环版fib--------------####def fib2(x):sum11sum21for i in range(x):if i0:sum1if i1:sum1elif i1:sumsum1sum2sum1sum2 sum2sum return sum print(fib2(6))
print() 2.2 没解决的奇怪报错问题
2.2.1 报错的代码
####------循环版fib--------------####def fib2(x):sum11sum21for i in range(x):if i0:sum1if i1:sum1elif i1:sumsum1sum2sum1sum2 sum2sum return sum print(fib2(6))
print()for i in range(6):print(fib2(i))
print()
2.2.2 导致报错的代码报错的部分由于下面这部分引起
开始我并没有发现
后面发现删除这段代码就不报错 for i in range(6): print(fib2(i)) print() 2.2.3 报错内容
UnboundLocalError: cannot access local variable sum where it is not associ 报错解释
UnboundLocalError 指的是在函数内部尝试访问一个还没有赋值的局部变量。在 Python 中如果你在函数内部给一个变量赋值了它就会被视为一个局部变量除非明确地声明它是全局变量。如果你在赋值之前就尝试访问它就会引发 UnboundLocalError。
报错原因可能是你在给变量 sum 赋值之前就尝试使用它或者你的函数内部有一个 sum() 内置函数的调用导致名称冲突。 2.2.4 暂时没有找到好的解决办法 3 关于 fibo的循环版本的详细说明
3.1 对循环版fibo数列的 详细打点说明版本可以清晰看到过程 ####------循环版fib详细打点--------------####
def fib3(x):#sum0 #为啥详细版的这里不设 sum0 不报错呢sum11sum21for i in range(x):print(for循环第, i1 ,轮开始)if i0:sum1if i1:sum1#sum3sum1sum2#sum4sum3sum2#sum5sum4sum3#从这些公式里抽象出循环的变换规律抽象出通用公式先辅助的值变换公式elif i1: #直接用 esle居然不行必须判断 elseif i1print(sum1,sum1)print(sum2,sum2)sumsum1sum2print(sum,sum)sum1sum2 #和下面那句顺序不能反sum2sum print(sum1,sum1)print(sum2,sum2)print(sum,sum)print(for循环第, i1 ,轮结束)print()return sum print(fib3(6))
print()3.2 最核心的先要从表面的 递推关系上找到 通项公式组 if i0: sum1 if i1: sum1 sum3sum1sum2 sum4sum3sum2 sum5sum4sum3 可以看到S3S2S1S4S3S2...通项公式 S(n) S(n-1) S(n-2)但是循环不能像递归那样调用 函数本身那就要找到 通项公式里的循环规律除了S(n) S(n-1) S(n-2)仔细看还有S(n-1)S(n)还有S(n-2)S(n-1) 因此联立这3个方程就可以了 S(n) S(n-1) S(n-2)S(n-1)S(n)S(n-2)S(n-1) 4 目的总结 递归和循环思想的相同和区别
4.1 区别
递归是在函数内部调用函数自身 函数定义内部函数的代码block里引用自己的函数名不用直接写循环写调用函数自身没有直接的for while等循环形式但是其实内部已经是循环逻辑了 循环是除了处理一些特殊情况外找到通项公式以便进行循环肯定有循环的形式如for while等有可能是几个 通项公式方程组反正要组成合理的循环体镶嵌在前面的循环形式for/while等之内 for i in range(x): if i0: sum1 if i1: sum1 elif i1: sumsum1sum2 sum1sum2 sum2sum 4.2 相同
本质都是循环逻辑都需要找出数列的通项公式便于告诉计算机进行循环计算在fibo数列里循环方式找通项公式更难 5 比较网上别人写的 fibo的 递归和 循环的代码