用python函数写斐波那契数列的函数_python—函数进阶-斐波那契数列

本文介绍了如何使用Python函数和生成器实现斐波那契数列。通过示例展示了普通函数与带有yield的生成器的区别,强调了生成器在处理复杂算法和节省内存方面的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上次说到生成器的调用next(),这样很不方便,需要手动调,我们一般是循环着调,while ,for都可以

a = (i for i in range(5))

for i in a:

print(i)

0

1

2

3

4 # 执行结果

#和手动调的区别是没了的话就会自动终止循环。就跳出来了

#换成while

a = (i for i in range(5))

while True:

next(a)

0

1

2

3

4

Traceback (most recent call last):

File "", line 2, in

StopIteration # 执行结果,会报错

#所以一般会用for循环,相当于错误内部就给消化了

补充:其实range(10)底层就是用生成器实现的,也就是每循环一次加一,再python3.x里,range(10)的执行结果是range(0,10),而在python2.7里,结果是直接生成了一个列表[0,1,2,3,4,5,6,7,8,9],这是因为python3中他不是一个普通的range(),是一个公式,就根本没有创建,只有循环到了才创建这个值,但是再python2 里有和python3里range()方法相同的是xrange()。

前面所讲的加1是最简单的,生成器是可以做复杂的算法的。再列表生成式里最复杂的最多写三元运算,而要是做更复杂的,就需要用函数来做这个生成器。

比如,数学上著名的斐波那契数列,(除了第一个和第二个数之外,任意两个数都可由前两个数相加得到)1,1,2,3,5,8,13,21,34......(没什么用,就是一个规律)

如果把前15个数相加,斐波那契数列用列表生成式写不出来,但是可以用函数把他轻松的打印出来

def fib(max):

n, a, b = 0, 0, 1

while n< max:

print(b)

a, b = b, a+b

n = n+1

return 'done'

注意赋值语句:a, b = b, a+b

试一下:

fib(15)

1

1

2

3

5

8

13

21

34

55

89

144

233

377

610

'done' # 执行结果

把他变成生成器只需要一步

def fib(max):

n, a, b = 0, 0, 1

while n< max:

yield b

a, b = b, a+b

n = n+1

return 'done'

print(fib(15))

#执行结果

#接下来调用

def fib(max):

n, a, b = 0, 0, 1

while n< max:

yield b #只要函数中出现了yield,就变成了一个生成器,它的作用就是把函数的执行过程冻结在这一步,并且把 b 的值返回给next

a, b = b, a+b

n = n+1

return 'done'

f = fib(15)

print(next(f))

print(next(f))

print(next(f))

print(next(f))

1

1

2

3 # 执行结果

# 换成循环的方式调用

def fib(max):

n, a, b = 0, 0, 1

while n< max:

yield b

a, b = b, a+b

n = n+1

return 'done'

f = fib(15)

for i in f:

print(i)

1

1

2

3

5

8

13

21

34

55

89

144

233

377

610 # 执行结果

#分析

def fib(max):

n, a, b = 0, 0, 1

while n< max:

print('yemao')

yield b #函数到这儿并没有返回就结束了,而是冻结了,接下来怎么继续往下走呢

print(b)

a, b = b, a+b

n = n+1

return 'done'

f = fib(15)

print(f) 并不会有执行结果,不会调用,只是生成了一个生成器

next(f)# 调用next才会被执行

#yield比之前的函数好的地方其实是,函数一执行,就会再函数里面打印等结果,不能往外返回,

#而用yield就可以在执行的过程中把想要的值返回出来,

#yield以后, 函数外面加()根本不会调用,而是生成了一个生成器

#如果要中途终止这个生成器

def range2(n):

count = 0

while count < n:

print('count', count)

count += 1

sign = yield count #return

if sign == 'stop':

print('---sign', sign)

break

return 3333

new_range = range2(3)

n1 = next(new_range)

new_range.send('stop')

#next只能是唤醒生成器并执行

#send可以是唤醒并执行,还可以发送给一个信息到生成器内部

count 0

Traceback (most recent call last):

---sign stop

File "E:/pycharm/pyCharm/考核/lianxi.py", line 16, in

new_range.send('stop')

StopIteration: 3333 # 执行结果

### 关于Python中实现斐波那契函数Python中,可以通过多种方法实现斐波那契函数。以下是几种常见的实现方式及其代码示例。 #### 方法一:迭代法 通过循环的方式生成斐波那契数列,这种方法效率较高且易于理解。 ```python def fibonacci_iterative(n): if n <= 0: return [] elif n == 1: return [0] elif n == 2: return [0, 1] fib = [0, 1] for i in range(2, n): fib.append(fib[i-1] + fib[i-2]) return fib ``` 上述代码展示了如何利用循环结构生成指定长度的斐波那契数列[^1]。 --- #### 方法二:递归法 递归是一种直观的方法来定义斐波那契序列中的每一项。然而需要注意的是,递归方法对于较大的`n`可能会导致性能问题。 ```python def fibonacci_recursive(n): if n <= 0: raise ValueError("输入值应大于等于1") elif n == 1: return 0 elif n == 2: return 1 else: return fibonacci_recursive(n-1) + fibonacci_recursive(n-2) ``` 该递归版本可以用于计算斐波那契数列中任意置上的数值[^3]。 --- #### 方法三:动态规划优化版 为了提高递归算法的效率,可以采用记忆化技术存储已经计算过的中间结果。 ```python def fibonacci_memoization(n, memo={}): if n <= 0: return [] elif n in memo: return memo[n] elif n == 1: memo[1] = 0 return 0 elif n == 2: memo[2] = 1 return 1 memo[n] = fibonacci_memoization(n-1, memo) + fibonacci_memoization(n-2, memo) return memo[n] ``` 这种改进后的递归形式能够显著减少重复运算次数并提升程序运行速度。 --- #### 综合比较不同方法的应用场景 当需要快速获取整个数列时推荐使用 **迭代法**;如果仅需知道某一项的具体值,则可以选择更简洁明了但可能牺牲部分效能表现 的 **递归法**, 或者考虑引入缓存机制从而兼顾两者优点 的 **带备忘录的递归法**(即 动态规划)[^2]. ```python # 测试以上三种方法的结果一致性 if __name__ == "__main__": n = 10 print("迭代法:", fibonacci_iterative(n)) print("递归法:", [fibonacci_recursive(i+1) for i in range(n)]) print("动态规划法:", [fibonacci_memoization(i+1) for i in range(n)]) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值