Python简单项目实现3(完全数/斐波那契数列)

本文介绍了使用Python解决两个问题:找出1000以内的完全数,以及计算斐波那契数列的第n项。作者提供了两种方法求解完全数,一是遍历所有因子,二是优化部分循环。同时,展示了递归和非递归求解斐波那契数列的方法及其优缺点。
摘要由CSDN通过智能技术生成

你好,欢迎查看我的第三个笔记。本人是某不知名大学数学系大一新生,由于对计算机感兴趣,所以跟着B站上老师学习python语言。每道题目我都尽我所能地讲清楚,如果有什么看不懂的地方欢迎在评论区留言,大家一起学习共同进步。

目录

项目7:找出1000以内所有完全数

总体思路:

做法1:

做法2:

项目8:求斐波那契数列的第n项值

思路1:

思路2:

总结延申:


项目7:找出1000以内所有完全数

定义:如果一个数恰好等于它的所有因子(不包括自身)之和,则称该数为“完全数”,例如6的因子为1 2 3,它就是完全数

总体思路:

遍历1~1000,找出每个数所有因子之和,选择性输出

做法1:

for a in range(1,1001):#遍历1~1000
    sum=0#因为不同的a之间并无联系,所以对每个a都把sum初始化为0
    for b in range(1,a+1):#遍历1~a
        if a%b==0:
            sum+=b+a/b
    if sum==4*a:#下面有说明
        print(a)

这是我第一时间想到的做法,个人感觉比较自然,故首先提出来

这段代码唯一可能不大看得懂的地方就是第6行中 sum==4*a ,其实这行表达式的得出并不困难,读者可以先自行推导,下图提供一种推导思路:

由上面流程图我们知道a=6时sum=24=4a,我们将其应用到其他完全数上也是适用的,由此,我们解释了 sum==4*a 的由来

做法2:

for a in range(1,1001):
    sum=0
    for b in range(1,a):
        if a%b==0:
            sum+=b
    if sum==a:
        print(a)

做法2是对做法1的改造,改造点如下

  1. "b"遍历的范围变成了1~(a-1)
  2. 每次遍历b判断为Ture时sum=sum+b

下面对这两个改造点分别做解释

  1. 对于改造点1:去除了a自身而已
  2. 对于改造点2:因为他遍历了1~(a-1)的所有数,而所有因子毋庸置疑都在1~(a-1)内部,所以这样做以后实际上就包含了所有的因子了。

项目8:求斐波那契数列的第n项值

定义斐波那契数列:【1,1,2,3,5,8,13,21......】

思路1:

用递归思想,创建一个函数FB(n),以 FB(n)=FB(n-1)+FB(n-2) 为“前进动力”;以FB(1)=FB(2)=1为边界条件。

def FBnum(n):
    if n==1 or n==2:
        return 1
    else:
        return FBnum(n-1)+FBnum(n-2)
print(FBnum(int(input("n="))))

思路2:

不用递归,而是定义一个 list [1,1],不断在末尾填充(list.append)下一个元素(即斐波那契数列的下一项)

n=int(input("n="))
Fbs=[1,1]
for i in range(2,n+1):#2~n
    Fbs.append(Fbs[i-1]+Fbs[i-2])
print(Fbs[n-1])

其中的Fbs是一个list,它的元素为斐波那契数列各项

举个例子:

我们输入n=3(这时i的取值范围是2,3)i=2时向Fbs尾部追加(Fbs[1]+Fbs[2]=)2;i=3时向Fbs尾部追加(Fbs[2]+Fbs[1]=)3,故for循环结束后Fbs变成了[1,1,2,3],为斐波那契数列前4项,我们取其中索引为(n-1=)2的元素即为 2

总结延申:

这里我们讨论一下递归算法的优缺点:

优点:代码写着简单舒服,只需要一个递归方程终止条件即可

缺点:运行起来消耗计算机算力大,特别是在n特别大时,递归深度大,可能造成崩溃的情况。

总结下来就是这位知乎老哥的说法:

  • 59
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值