Python3实现斐波那契数列的4种方法详解

拾柒
拾柒
发布时间:2026-10-13 | 1人浏览过
原创

本文详细介绍Python3中实现斐波那契数列的四种方式:基础列表法、升级版列表操作、解包省内存法及迭代器类实现。通过对比代码示例,分析各方法在内存占用、执行效率及适用场景上的差异,帮助开发者根据实际需求选择最优方案。

基础列表法实现

第一种方法是基础版,主要利用列表(list)来存储结果。这种方式逻辑直观,但如代码所示,通过递归调用 `list_n` 函数并不断追加到列表 `list_res` 中,会导致大量的内存消耗。代码首先接收用户输入的数字 `w`,定义函数 `list_n`,当 n 大于等于3时递归计算前两项之和,否则返回1。随后通过循环生成指定长度的数列。这种方法虽然简单易懂,但在处理较大数值时效率较低且占用内存较多。


# 比较占内存
w = int(input("输入一个数字还你一个斐波那契数列:"))
list_res = []
def list_n(n):
  if n>=3:
    res=list_n(n-1)+list_n(n-2)
  else:
    res=1
  return res

print("开始")

for i in range(0,w):
  list_res.append(list_n(i+1))
print(list_res)

升级版列表操作

第二种方法是升级版,同样基于列表操作,但改进了生成逻辑。代码接收输入 `num`,初始化列表 `list_nums` 为 `[1, 1]`。函数 `calculate` 通过 `while` 循环,利用 `insert` 方法在列表指定位置插入新元素(当前两项之和),从而逐步构建数列。当循环结束后,打印生成的完整数列并返回第 `num` 个元素。尽管此版本避免了部分递归开销,但由于频繁使用 `insert` 操作,随着列表增长,内存和计算开销依然较大,代码注释中也明确标注了“比较占内存”。


# 比较占内存
num =int(input("输入一个数字还你一个斐波那契数列v2.0:"))
list_nums=[1,1]
def calculate(num,list_nums):
  i = 0
  if num>2:
    while i < num:
      list_nums.insert(i+2,list_nums[i]+list_nums[i+1])
      i+=1
    else:
      print("数列已生成")
      print(list_nums)
    return list_nums[num-1]
  else:
    return list_nums[0]

res = calculate(num,list_nums)
print("="*50)
print("第%s个:%s"%(num,res))

解包省内存法

第三种方法被推荐为最实用版本,核心优势在于节省内存。该方法不使用列表存储所有历史数据,而是仅保留前两个变量 `a` 和 `b`。函数 `fbnq` 接收参数 `n`,若 n 为1或2直接返回1;否则通过 `while` 循环迭代更新 `a` 和 `b` 的值(利用Python的解包特性 `a,b=b,a+b`),直到达到目标项数。这种方式空间复杂度为 O(1),仅存储当前状态,非常适合计算单个大数值的斐波那契数,代码中直接打印结果,简洁高效。


#省内存
def fbnq(n):
  a,b=1,1
  if n==1 or n ==2:
    return 1
  else:
    i=3
    while i<=n:
      a,b=b,a+b
      i+=1
    return b

print(fbnq(int(input("输入一个数:"))))

迭代器类实现

第四种方法采用迭代器模式,通过自定义类 `feibo` 实现。该类初始化时设定长度 `length` 及初始值 `num1=0`, `num2=1`。关键之处在于实现了 `__iter__` 和 `__next__` 魔术方法,使其成为可迭代对象。在 `__next__` 中,通过判断索引是否达到长度来抛出 `StopIteration` 异常以终止迭代,否则更新数值并返回当前项。这种方式实现了惰性求值,按需生成数据,既符合Python迭代器协议,又具备良好的扩展性,适合需要遍历整个数列的场景。


"""实现斐波那契数列"""


class feibo(object):
  def __init__(self, length):
    self.num1 = 0
    self.num2 = 1
    self.num = self.num1
    self.length = length
    self.index = 0

  def __iter__(self):
    return self

  def __next__(self):
    self.num = self.num1
    while True:
      if self.index == self.length:
        raise StopIteration
      self.num1, self.num2 = self.num2, self.num1+self.num2
      self.index += 1
      return self.num


myfbnq = feibo(10)
# print(list(myfbnq))  # 指针位置已到最后一位
for i in myfbnq:
  print(i)

以上介绍了Python3实现斐波那契数列的四种不同方法,从基础列表存储到迭代器类实现,各有优劣。基础版适合理解递归逻辑,升级版优化了列表操作但仍有内存瓶颈,解包法在空间效率上表现最佳,而迭代器法则提供了更优雅的面向对象解决方案。希望这些示例能对学习Python算法和数据结构有所帮助,欢迎参考并应用于实际开发中。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表