利用Python求斐波那契数列的第N项以及前N项和(循环、递归、集合)

著名的斐波那契数列,即从第三项开始,每一项都等于前两项之和。

之前写过利用Java语言来编写,由于最近正在学Python,所以将自己的想法记录在此,有需要的朋友可以参考一下。

写在前面:这里的三个方法其实思路是差不多的,因为第一项和第二项没有前两项,所以无法直接求出本项,故使用了直接指定的方式。

方法一:利用if判断和for循环来实现

这个方法感觉稍微有些复杂,使用到了if判断、for循环以及变量交换等知识点,难度不高,初学者理解起来可能稍微有些困难(不推荐使用次方法,没啥技术含量,完全是为了用for循环实现而编写)

先贴代码:

"""
求斐波那契数列第n项以及前n项和
斐波那契数列:从第二项开始,每一项都等于前两项之和
1,1,2,3,5,8,13,21,34,55,89,144,...
"""
n = int(input("请输入要求斐波那契数列第几项:"))
Sum = 0  # 定义初始总和
num2 = 1  # 第一项,也为后续的前两项
num1 = 1  # 第二项,也为后续的前一项
if n == 1 or n == 2:  # 如果是前两项,值都为1
    num2 = 1
    Sum = n  # 这里取了个巧,因为前1项的和为1,前2项的和为2,就不用单独判断n是1还是2了
else:
    Sum = 2
    for a in range(0, n - 2):  # 利用循环来进行求值,每次循环求出第a+2项,直到循环到第n项
        temp2 = num2  # 前2项
        temp1 = num1  # 前1项
        temp = temp1 + temp2  # 当前项
        Sum = Sum + temp  # 和(等于前1项和前2项之和)

        # 为下一次循环做准备
        num2 = num1  # 下一次循环的前两项为本次的前一项
        num1 = temp  # 下一次循环的前一项为本次的当前项
print("第" + str(n) + "项为:" + str(temp), "\n前" + str(n) + "项和为:" + str(Sum))

解释:

  1. 定义第一项、第二项以及总和三个变量

  2. 判断是否求第一项或第二项 前两项无法用前两项之和求,所以直接定义

  3. 从第三项开始就可以使用前两项之和来求 定义Sum初始值为2,也就是前两项之和

  4. 开始循环(从第三项开始(所以范围为n-2),求第几项就循环几次。
    求第三项:
    将前两项的值(也就是1)赋值给临时变量2,用来存储本项前2项的值
    将前一项的值(还是1)赋值给临时变量2,用来存储本项前1项的值
    temp为本项的值,计算方法当然是前2项+前1项
    求和:累加,之前的Sum值加上本项的值

    接下来的两行代码就是为下一次循环做准备了,如果没有下一次循环,那这一次的准备就用不到,但是不影响。
    将本次(也就是第三项)的前1项作为下一次循环(第四项)的前两项
    将本次(也就是第三项)的本项作为下一次循环(第四项)的前一项

  5. 输出

使用for循环求斐波纳契数列第N项以及前N项的方法到这里就结束了,经测试能够正确求出,如下图所示:
在这里插入图片描述

方法二:利用递归实现

这个方法相对来说简单,理解上稍微有点难

老规矩,先贴代码:

"""
求斐波那契数列第n项以及前n项和
斐波那契数列:从第二项开始,每一项都等于前两项之和
1,1,2,3,5,8,13,21,34,55,89,144,...
"""
n = int(input("请输入要求斐波那契数列第几项:"))
Sum = 0  # 定义初始总和


def number(x):  # 定义一个number方法,用来求第X项的和
    if x == 1 or x == 2:
        return 1
    else:
        return number(x - 2) + number(x - 1)


for a in range(1, n+1):
    Sum = number(a) + Sum
print("第%d项为:%d,前%d项和为%d" % (n, number(n), n, Sum))

解释:

  1. 定义总和变量
  2. 定义number(x)方法,用来求第x项的值。
    此方法将用户输入的n值传入方法中进行运算,先判断是否为第一项或者第二项,如果是则直接返回1,否则则返回前2项与前1项的和(也就是第x项)
    定义循环,循环变俩从1开始到n(需要包括n,所以代码中为n+1)
  3. 这个就比较好理解了,for循环将前n项加起来,就得到了前n项和。
  4. 打印输出

运行结果:

在这里插入图片描述

这个方法是我觉得最简洁代码效率最高的,但是要小心使用,毕竟递归嘛,搞不好就无限循环了。

方法三:利用集合实现

代码来喽~

"""
求斐波那契数列第n项以及前n项和
斐波那契数列:从第二项开始,每一项都等于前两项之和
1,1,2,3,5,8,13,21,34,55,89,144,...
"""

n = int(input("请输入要求第几项:"))
list1 = []
Sum = 0  # 定义初始和为0
num = 0
if n == 1 or n == 2:
    for a in range(0, n):
        list1.append(1)

else:
    list1 = [1, 1]  # 前两项比较特殊,直接指定
    for a in range(0, n - 2):  # 从第三项开始,前两项已经排除
        list1.append(list1[a] + list1[a + 1])  # 将前1项与前2项的和添加到列表中

for a in list1:  # 将list1中的元素相加
    Sum = Sum + a

print("第%d项为:%d,前%d项之和为:%d" % (n, list1[n - 1], n, Sum))
print(list1)

解释:

  1. 定义空的列表和sum

  2. 判断是否为第一项或第二项,如果是,则直接在列表中添加1(因为前两项的值都为1)

  3. 从第三项开始,则要用我们的算法开始计算(本项=前2项+前一项),前两项比较特殊,直接制定前两项

  4. 遍历集合,将集合中的每一个元素值都加到Sum中

  5. 打印输出

效果如图:
在这里插入图片描述这个方法理解起来最为简单,说白了就是根据你的需要,不停的往列表内添加元素,需要哪一项就输出哪一项。求和的时候遍历列表,将列表内的元素相加就ok。

以上就是使用循环、递归、列表三种方式求斐波那契数列第n项和前n项之和的全部内容了。相信各位大佬也能看出来代码写的很稚嫩,我也是新手,一边学习一边记录,方便自己,也可以给有需要的朋友参考一下。如果有不足的地方希望各位大佬可以指出并指教一下,不胜感激!

  • 12
    点赞
  • 65
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页
评论

打赏作者

正在学Python的小陈

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值