利用Python求斐波那契数列的第N项以及前N项和(循环、递归、集合) |
您所在的位置:网站首页 › python集合相加的方法 › 利用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))解释: 定义第一项、第二项以及总和三个变量 判断是否求第一项或第二项 前两项无法用前两项之和求,所以直接定义 从第三项开始就可以使用前两项之和来求 定义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中 打印输出 效果如图: |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |