【问题标题】:Printing all primes recursively given a number给定一个数字递归打印所有素数
【发布时间】:2018-12-08 10:43:51
【问题描述】:

我们可以递归打印给定数字以下的所有素数吗?例如,如果调用 printPrimes(10),它应该打印 2,3,5,7。我可以递归检查单个数字是否为素数并逐个迭代“n”。但我想知道是否可以使用纯递归解决方案。

【问题讨论】:

  • 如果这里的答案对您有帮助,请接受其中之一。这对您、回答者和SO 的其他用户有很多好处。阅读this

标签: java recursion


【解决方案1】:

发布我的一个 cmets 作为答案: 您可以通过一个接受一个参数的递归方法来完成它,最初发送 n 并在每个后续递归调用中减少它,直到它达到 1,这是您递归的终止条件。这将使您的 API 更干净

以下是Java中的代码:

public void printPrimesBelow(int n) {
    if(n > 1) {
        if(isPrime(n)) {
            System.out.println(n);
        }
        printPrimesBelow(n-1); // recurse over n-1
    }
}

小修改:

如果您将递归调用放在if 语句上方,则打印它们的素数的顺序将增加。

【讨论】:

  • 它会在 n=100000 时抛出“Stackoverflow 错误”,但我也使用递归实现了 isPrime。也许对 2 个函数使用 2 个递归会产生此错误。
【解决方案2】:

所以你已经有了一个检查单个数字是否为素数的函数?那么确定

public void printNPrimes(int start, int n){
    if (start == n)
        return;
    if (isPrime(start))
        System.out.print(start);

    printNprimes(start + 1 , n );
}

用 printNprimes(0 , n) 调用这个函数; n 是你想要达到的数字

【讨论】:

  • 为什么递归方法需要两个参数?您可以通过一个参数来完成,最初发送n 并在随后的每个递归调用中减少它,直到它达到 1,这是您递归的终止条件。这将使您的 API 更加简洁,因为用户不必弄清楚将什么作为第一个和第二个参数传递。
  • @OleV.V.完毕。谢谢你的建议:)
  • @LavishKothari 这是真的,但我想这样你可以指定一个范围
猜你喜欢
  • 2020-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-21
  • 1970-01-01
  • 2016-05-07
  • 2021-12-28
相关资源
最近更新 更多