【问题标题】:How to solve program recursively如何递归求解程序
【发布时间】:2017-05-09 03:05:18
【问题描述】:

我需要一个满足以下引用的程序的帮助:

所有整数 >= 2 都可以分解为只有素数的乘积 数字。例如,数字 12 的素数分解为 2*2*3,而数字 100 的素数分解为 2*2*5*5。我们 有兴趣知道输入整数是否有素数 只有 2s 和 3s 的因式分解。

我认为我需要更多的基本条件和全部递归调用。

当前(未完成)代码:

    public static boolean hasFactors2and3(int number) throws IllegalArgumentException{
        if (number < 2) throw new IllegalArgumentException("Number is less than 2");
        if (number >= 2 && number < 5) return true; // because for all these numbers it works
        if (number % 2 == 0) return hasFactors2and3(number /= 2);
        if (number % 3 == 0) return hasFactors2and3(number /= 3);

    }

感谢任何帮助!

【问题讨论】:

  • 抱歉,StackOverflow 不是代码编写或家庭作业完成服务。请访问help center 并阅读How to Ask 以了解如何有效地使用本网站
  • 这并不是在每种情况下都返回一个值。如果数字通过所有if 语句,它应该返回什么值?你能想出一个数字吗?
  • 以牺牲一些速度为代价,我建议将数字分解为因子的List,然后检查List 是否有除 2 或 3 之外的任何值。恕我直言,优点是错误检查能力稍好,未来校对能力也更好(即,易于添加新的因子测试以查看是否有 5)。换句话说,在因式分解中更通用一点,分别应用测试逻辑。
  • 递归是通过解决同一问题的较小版本来解决问题。在这种情况下,问题的较小版本将出现在number/2number/3。这是我认为你应该得到的最大暗示。
  • 您的代码看起来不错,但正如您所说,不完整。当你到达它的底部时,你知道number 至少是 5,并且 2 和 3 都没有分成它。你能弄清楚如何处理这样一个数字吗?

标签: java recursion prime-factoring


【解决方案1】:

您要求递归解决方案。我不会给你那个。相反,我会在伪代码中为您提供一个非递归解决方案,并让您将其转换为递归解决方案。

function hasFactors2and3(number)

  // Deal with negatives, 0, 1.
  if (number < 2)
    return false
  endif

  // Remove factors of 2.
  while (number MOD 2 == 0)
    number <- number / 2
  endwhile

  // Remove factors of 3.
  while (number MOD 3 == 0)
    number <- number / 3
  endwhile

  // See what factors are left after removing all 2s and 3s.
  return number == 1

end function

提示:研究如何使用循环去除尾递归,然后逆向处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    • 2021-05-25
    • 1970-01-01
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多