使用递归c ++找到最小的素数

Posted

技术标签:

【中文标题】使用递归c ++找到最小的素数【英文标题】:Finding the smallest prime factor using recursion c++ 【发布时间】:2020-07-03 01:23:35 【问题描述】:

我是 C++ 新手,我的任务是编写一个代码,该代码使用递归找到数字的最小素因子。如果 N 小于 2,则代码应返回 1。如果 N 本身是素数,则代码应返回 N。否则,代码应返回 N 的最小素数。我尝试了这个问题,但我使用了 for 循环检查最低的主要因素,我不确定在我的答案的上下文中这种方法是迭代的还是递归的。要调用 main 函数,用户应输入lowestPrimeFactor(x);,其中x 是他们想要为其找到最低素因子的数字。我坚持尝试将迭代部分更改为递归部分,其中代码检查最低的主要因素。如有任何反馈,我将不胜感激。

#include <stdio.h>
#include <iostream>
#include <math.h>
long lowestPrimeFactor(long N, long i=2) 
    if(N<2)  //if N is less than 2, return 1
        std::cout << 1; //print to screen to check
        return 1;
    

    bool isPrime =true; //Check if number is prime
    for(i=2;i<=N/2; ++i)
        if(N%i==0)
            isPrime=false;
            break;
        
    
        if (isPrime)
            std::cout<<N;
            return N;
        

        for (int i = 3; i* i <= N; i+=2) //This is where I am unsure how to translate to recursive as it is based of an iterative solution
                if(N%i == 0)
                std::cout<<i;
                return i;
    


//Driver code to check functionality
int main()
lowestPrimeFactor(19);



编辑 我想我已经正确地修改了代码以递归进行主要因素检查

        //Recursive
        if(i*i<=N)
            N%i==0; lowestPrimeFactor(i);
        
        else return i;

只需要尝试调整 bool 部分也可以递归

【问题讨论】:

'我不确定在我的答案上下文中这种方法是迭代的还是递归的。'如果这是您的问题,那么答案是迭代的。需要在lowestPrimeFactor() 内部调用lowestPrimeFactor() 才能使其递归。 好的,谢谢,我试图将这个 'for' 语句更改为带有 'return i' 的 'if' 但我无法让条件起作用,你的意思是 return 语句如果是这样的话,应该调用最低的Primefactor()。 我刚刚意识到我没有在代码之外指定我的问题,抱歉,您认为这是我卡住的地方是正确的。 我还没有深入了解对最低PrimeFactor() 的调用应该去哪里。我只是说在某处这样的调用是递归编程的决定性质量。 【参考方案1】:

试试这个:

#include <iostream>

using namespace std;

long lowestPrimeFactor(long N, long i = 2) 
    if (N % i == 0) // Test for factor
        return i;
    else if (i < N * N)
        return lowestPrimeFactor(N, i + 1); // Test next factor
    else
        return N;


void test(long N)
    // Format results
    cout << N << " gives " << lowestPrimeFactor(N) << endl;


int main() 
    for (long N = 2; N < 30; ++N)  // Generate some test cases
        test(N);

这也有效率低下,它也测试非主要因素(我认为原始解决方案也是如此)所以真的而不是使用i + 1(i 之后的下一个整数)递归,我们应该计算并传入i 之后的下一个素数。

【讨论】:

如果你从i=3开始,你可以跳过所有的偶数(return lowestPrimeFactor(N, i+2),那么你只需将它包装在一个函数中,检查N是否是偶数并返回2或@987654328 @取决于N的奇偶校验 你也有错误,i &lt; N * N应该是i &lt; sqrt(N) 是的。实际上,i * i 【参考方案2】:

如果您想使用递归来检查最低素因子而不是最后一个 for 循环,所需的代码如下:

#include <iostream>

long lowestPrimeFactor(long N,long pr = 3)

bool isPrime =true;
if(N<2)
  //if N is less than 2, return 1
    std::cout << N << std::endl;//print to screen to check
    return 1;
    
else

    for(long i=2;i<=N/2; ++i)
    
        if(N%i==0)
        
        isPrime=false;
        break;
        
    

if(isPrime)

    std::cout << N << std::endl;
    return N;

else

    if(N%2==0)
        std::cout << 2 << std::endl;
        return 2;
    
    else
    
        if(N%pr == 0)
        
            std::cout << pr << std::endl;
            return pr;
        
        else
        
            return lowestPrimeFactor(N,pr+2);
            
    



//Driver code to check functionality
int main()

lowestPrimeFactor(19);
lowestPrimeFactor(20);
lowestPrimeFactor(7);
lowestPrimeFactor(1);
lowestPrimeFactor(15);

这不是完全递归的,但它只检查直到 7 的素数,然后检查 9 等等,即即使是原始代码也有的奇数。 注意:它正确检查的素数:2、3、5、7 和素数

【讨论】:

以上是关于使用递归c ++找到最小的素数的主要内容,如果未能解决你的问题,请参考以下文章

使用递归函数查找数组的最小数量

使用最小生成树查找从 A 到 B 的路径 - C/C++

使用 D&C/递归的最大子数组

使用递归c ++返回数组的子集

使用C中的递归二进制搜索查找目标索引

使用递归js在树状对象中查找最小值和最大值