*大质因子的递归解法&Python:
*大质因子的递归解法&Python:
问题描述:
求一个任意正整数的*大质因子,呈上代码及注释:
# *大质因子
def calc(x:int)->int:# 函数参数类型设置以及返回值类型设置
if x==1:## 如果这个数字是1,则*大质因子一定是1,毋庸置疑
return 1
for 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进行除法之后,这个石块依然在除法的结果中,我们进行的除法,只是起到了过滤筛的作用,还是那句话,我们假定函数完全可以胜任我们所需要的工作,只需要把参数丢给它,我们只需要确定的是参数的正确性,而我们已经确定了石块就在我们传递的参数内,所以拿到正确结果也是理所当然。