最大质因子的递归解法&Python:


问题描述:

求一个任意正整数的最大质因子,呈上代码及注释:

# 最大质因子
def calc(x:int)->int:# 函数参数类型设置以及返回值类型设置if x==1:## 如果这个数字是1,则最大质因子一定是1,毋庸置疑return 1for i in range(2,x):##   如果这个数字不是1,就从2开始,一直找到这个数字的前一个数字,寻找if x%i==0:      ## 这个数字的最小的因子,然后将这个数字除以最小的因子,再将结果的最大质因子返回给调用者return calc(int(x/i))return x## 如果数字既不是1,又没有1和其本身之外的任何因子,那么这个数字本身就是最大质因子
print(calc(600851475143))

递归思想、代码及注释分析:

代码部分是非常简单易懂的,都是些基础的python语法,我要讲的是注释部分,注释部分是基于我个人对于递归的理解写出来的,在此跟大家分享我对于递归的拙见。
首先,在递归解决问题的过程中,每次的递归都是重复着只有参数不同的工作,所以即使是在递归函数仅仅只写了一个函数定义的时候,我们就可以假定它已经完全可以胜任我们所需要的工作了,接下来,我们给它设置一个出口,让它可以在最简单的情况下直接完成工作,本例中就是x==1的情况;最简单的情况完成之后,我们就可以开始研究比较复杂的情况了,这个要具体问题具体分析,我们已经假定它完全可以胜任我们所需要的工作,所以在本例中,我们找到x的最小因子之后,直接将x除以这个最小因子,然后求出这个结果的最大质因子(注意这一步就是我们之前提到的“假定它完全可以胜任我们所需要的工作”,直接把需求丢给函数,至于怎么完成的,我不需要知道),而这个最大质因子就是我们要的答案;最后不要忘了遗漏可能存在的特殊情况,本例中就是x为质数的情况。


笔者觉得递归的难点只在于逻辑的层层嵌套,但其实我们完全可以不用让自己的思路进入递归,我们只在外层逻辑上干好我们每一步的任务,至于实际上是怎么完成的,我并不需要知道。


为何要从除法的结果里面寻找最大质因子:

关于除1和本身之外的最小因子,和最大质因子的关系,我并没有总结出结论,实际上这个最小因子必定是个质数,而且最小因子一定是小于等于最大质因子的。那为什么要用x除以最小因子,然后再在结果中寻找x的最大质因子呢?我是这样想的,因为最大质因子,首先它是个质数,就像是沙子中的最大石块,我们无论怎么过滤掉沙子,石块也依然存在,我们设置寻找最小因子的范围是2到x-1,如果最小因子等于最大质因子,那么除法的结果里面既没有更大的质因子,又没有小于最大质因子的因子,也就是说,除法的结果只能是最大质因子的n次方;如果最小因子小于最大质因子,那么除法结果里面就必定包含最大质因子,所以在我们对x进行除法之后,这个石块依然在除法的结果中,我们进行的除法,只是起到了过滤筛的作用,还是那句话,我们假定函数完全可以胜任我们所需要的工作,只需要把参数丢给它,我们只需要确定的是参数的正确性,而我们已经确定了石块就在我们传递的参数内,所以拿到正确结果也是理所当然。

最大质因子递归解法python相关推荐

  1. python堆栈汉诺塔非递归_汉诺塔问题的递归解法和非递归解法(python语言实现)...

    汉诺塔问题的非递归解法(python语言类解法) #!/usr/bin/env python #coding:utf-8 import sys import time reload(sys) sys. ...

  2. LeetCode 144. Binary Tree Preorder Traversal--二叉树前序遍历--反向压栈--迭代-栈,递归--C++,Python解法

    题目地址:Binary Tree Preorder Traversal - LeetCode Given a binary tree, return the preorder traversal of ...

  3. LeetCode 105 Construct Binary Tree from Preorder and Inorder Traversal-前序中序遍历构造二叉树-Python和Java递归解法

    题目地址:Construct Binary Tree from Preorder and Inorder Traversal - LeetCode Given preorder and inorder ...

  4. c语言用递归求质因子,使用递归方法求解整数质因子

    使用递归方法求解整数n的质因子的步骤为: 1.找到n的最小质因子i,并将i放入集合P中: 2.n /= i:然后重复第1步,直到n本身为质数为止(即终止条件). 用公式表示如下: 实现代码如下: #i ...

  5. 汉诺塔python非递归实现,[Python3 练习] 006 汉诺塔2 非递归解法

    题目:汉诺塔 II 接上一篇 [Python3 练习] 005 汉诺塔1 递归解法 这次不使用递归 不限定层数 (1) 解决方式 利用"二进制" (2) 具体说明 统一起见 我把左 ...

  6. 搞懂质数,质因子,互质,最大公约数,最小公倍数.

    1.质数: 质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数. 借鉴y总的代码: bool is_prime(int n){     if(n<2)  return fals ...

  7. N!含有质因子2的个数

    题目来源于<编程之美>上的一道题.第2.2节"不要被阶乘吓到"中提出了一个问题"求N!的二进制表示中最低位1的位置".这个题目理解起来比较简单,就等 ...

  8. UVA-10212 The Last Non-zero Digit. 分解质因子+容斥定理

    这个是参考了别人之后的代码,POJ上0MS过了.Orz......对于一个序列在提取了2,5之后,例如1,2,3,4,5,6,7,8,9,10,我们可以将其中的奇数和偶数分开来对待,对于偶数序列2,4 ...

  9. 28行代码AC——Minimum Sum LCM UVA - 10791(最大质因子)

    励志用尽量少的代码做高效表达 题目(提交)链接-->UVA - 10791 题意 输入正整数n,找至少两个数,使得他们的最小公倍数(Least Common Multiple)为n且要输出最小的 ...

最新文章

  1. 计算机专业的金书,《计算机专业英语》书评,金书网
  2. QTP整合QC自动化测试--目录结构搭建
  3. 办公出口ip多个地址_如何正确分配与高效管理IP地址
  4. EasyUI加zTree使用解析 easyui修改操作的表单回显方法 验证框提交表单前验证 datagrid的load方法
  5. Oracle Database 12C 学习之多租户(连载四)
  6. 光纤到桌面FTTD解决方案
  7. 给WPS添加快捷键 智能粘贴 粘贴纯文本
  8. 多源数据融合:大数据分析的瓶颈
  9. java 调度_几种任务调度的Java实现方法与比较
  10. 一个人的行动力,取决于他的底层信念。
  11. 大型网站建设方案(学院网站建设方案)
  12. Mongodb 监控安装配置
  13. 香帅的北大金融学课笔记13 -- 投资决策
  14. golang 学习 - chan以及chan的一下用例
  15. honor荣耀开启影像新时代?探寻其背后真正实力
  16. 大华球机出现不明色块的解决历程
  17. KiBiEx互联网交易互动平台数字货币
  18. 实现用户一键登录的方案有哪些?
  19. 一篇文章看懂如何转行产品经理
  20. win10自带电影和电视无法加载字幕问题

热门文章

  1. Portal Server搭建(wifidog安装)
  2. 在matlab中数据波动指标,阶跃响应指标的matlab计算
  3. Springcould学习总结
  4. 【ArcGIS微课1000例】0052:创建地理数据库注记(标准注记、要素关联注记、尺寸注记)
  5. abap开发那点事 (二)
  6. easyUI datatimebox 设置时分秒不可修改
  7. 时间间隔感测试器(下):Arduino uno
  8. Java代码混淆工具ProGuard
  9. win10系统要求配置_观察者系统还原游戏配置要求高吗?Observer: System Redux硬件一览!...
  10. Android应用测速组件实现原理,这篇看完还不懂跟我去摆地摊,全网首发