【问题标题】:Recursive method - Java递归方法 - Java
【发布时间】:2013-09-28 12:35:01
【问题描述】:

补充资料:

芯片不支持乘法,只支持加法。我应该通过创建一个执行乘法的递归方法 mult() 来解决这个问题 x 和 y 通过将 x 添加到自身 y 次。它的参数是 x 和 y 以及它的返回值 值是 x 和 y 的乘积。然后我应该编写方法和 main() 到 调用它。

这是纯粹的逻辑思维,但每次我试图思考该怎么做时都会迷失方向。

我被困在数学部分.. 我所拥有的,这不起作用,我知道数学是错误的,但我不擅长这个:

public static void mult(int x, int y) {
    x = 0;
    y = 0;
    if (y > 0) {
        for (int i = 0; i < y; i++) {
            x = x * (x * y);
            return mult(x, y);
        }
    }
}

【问题讨论】:

  • "有人可以帮我写代码吗?"不会。但是当您遇到具体问题时,我们可以提供帮助并进一步指导您。你可以先让它递归,然后再问这个..
  • 家庭作业问题在这里不顺利。
  • @Zavior 我猜它现在是递归的。你能指出哪里出错了吗?
  • 递归永远不会终止。您需要找出停止递归的条件。

标签: java methods recursion


【解决方案1】:

当我听到“递归”时,我希望看到两件事:

  1. 一个函数调用自己每次修改参数
  2. 顶部的停止条件告诉函数何时停止,避免无限堆栈。

那么你的呢?在编写代码之前先用文字写下来。

【讨论】:

  • 这听起来很不错。从现在开始写代码之前我会先写下来..
【解决方案2】:

一种可能性是使用一个累加器来存储乘法的当前值。我用???替换缺失的陈述:

public static void main(String []args){
        System.out.println(mult(2,5));
 }
    public static int mult(int x, int y) {
      if(???) return ???;
      else return multAcc(???,???,???);
    }

    private static int multAcc(int x, int y, int acc){
        if(???) return ???;
        else return multAcc(???, ???, ???);
    }

【讨论】:

    【解决方案3】:

    ...通过将 x 添加到自身 y 次。

    您实际上可以这样做,而不是乘法。哦,也许如果您不将 x 和 y 都设置为零,您将需要添加一些内容;-)

    最后一件事:如果您想要递归解决方案,则不需要 for 循环。

    【讨论】:

      【解决方案4】:

      Java 在设计上没有 TCO,因此对线性(不是树状)进程使用递归是非常糟糕的主意。特别是对于这样的任务,它很可能会成为你程序的瓶颈。改用循环。

      哦,它必须是递归的吗?看起来像家庭作业。那就自己动手吧。

      【讨论】:

      • 哈哈,是的,这是某种“家庭作业”,但我实际上被困在数学部分..
      • 尾调用优化不是这样的学术问题的要求,因为它是为了暴露于递归。没有一个头脑正常的人会使用这样的东西。
      • @Sarge Borsch,真的很有趣:P
      • @duffymo Java 通常也不适合介绍编程。如果您了解 Java,您就会知道为什么。例如,它可能比 C++ 更好,但这并不意味着它是正确的选择。
      • 更重要的是,它会炸毁内存
      【解决方案5】:

      您需要记住的是,乘法是重复加法(假设两个操作数都是&gt;= 0),所以我们有:

      • 基本情况是y 为零时
      • 如果y 不为零,则再加一次x,并从y 中减去1

      请注意,只要y 是正数,它最终的值就会为零。所以基本上我们一直添加x,总共y次;这就是我的意思:

      public static int mult(int x, int y) {
          if (y == 0)
              return 0;
          return x + mult(x, y-1);
      }
      

      同样的代码也可以写成tail-recursive风格——意思是:在递归调用返回后没有什么可做的,这对于某些支持所谓的尾调用优化的语言很重要:

      public static int mult(int x, int y, int accumulator) {
          if (y == 0)
              return accumulator;
          return mult(x, y-1, x + accumulator);
      }
      

      上面会调用如下,注意最后一个参数总是初始化为零:

      mult(10, 5, 0)
      => 50
      

      【讨论】:

      • 不应该做别人的功课,至少不要直接回答:|
      • 感谢您的解决方案和解释。问题出在这段代码的数学方面。在本书的这一部分,我编写了更多的递归程序。但是由于数学原因,这个有点令人困惑..
      • @duffymo 和 Zavior :我还没有写完。介意重新考虑否决票吗?
      • @ÓscarLópez 您是否尝试过使用(mult(-2,-5, 0)); 的第二个解决方案?
      • 我对你投了反对票,因为你为学生做了太多的工作。
      【解决方案6】:
      public static int mult(int x, int y) {
              if (y == 0) {
                  return 0;
              }
              if (y > 0) {
                  return x + mult(x, y - 1);
              } else {
                  return -x + mult(x, y + 1);
              }
          }
      

      顺便说一句,这是解决方案

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-02
        • 2014-05-03
        • 2013-07-20
        相关资源
        最近更新 更多