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

您所在的位置:网站首页 python集合相加的方法 利用Python求斐波那契数列的第N项以及前N项和(循环、递归、集合)

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

2023-05-22 15:16| 来源: 网络整理| 查看: 265

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

之前写过利用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))

解释:

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

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

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

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

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

输出

使用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))

解释:

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

运行结果:

在这里插入图片描述

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

方法三:利用集合实现

代码来喽~

""" 求斐波那契数列第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)

解释:

定义空的列表和sum

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

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

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

打印输出

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

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


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3