【问题标题】:Turn a recursive method into an iterative method将递归方法变成迭代方法
【发布时间】:2015-07-06 03:16:53
【问题描述】:

我必须创建两个做同样事情的方法。这些方法必须计算从 0 到 30 的数字的 L(n),其中 L(n) 定义为

L(0) = 1

L(1) = 1

L(n) = L(n - 1) + L(n - 2) + 1; 当 n > 1

第一种方法必须使用我成功完成的递归编写,第二种方法必须使用迭代(数组和 for 循环) 第一种方法)

public static int rec(int x) {
  if (x == 0) return 1;
  if (x == 1) return 1;
  else return rec(x - 1) + rec(x - 2) + 1;
}

我在 main 中为第一种方法添加了这个

int x = 0;
    while (x <= 30) {
        System.out.println(rec(x));
        x++;
    }

这就是我用第二种方法所能做的,虽然我知道这是错误的,但请记住我是初学者,要温柔 第二种方法)

 public static long iter(long [] x){
    long result = 0  ;
    int length = x.length;
    for ( int i = 0 ; i < length ; i++){
        if ( i == 0 ) result = 1;
        if ( i == 1 ) result = 1;
        else  result += x[i-1]+x[i-2]+1;
    }
    return result ;
}

【问题讨论】:

  • 你应该在for循环中累积结果,现在你只需重新分配它。
  • 请注意,根据您的老师的要求水平,他可能期望更有效地实现递归方法。

标签: java algorithm recursion iteration


【解决方案1】:

想想你的代码在这里做什么 -

for ( int i = 0 ; i < x.length ; i++){
           long returnvalue = x[i-1]+x[i-2]+1; // every iteration you are resetting returnvalue. 
    }

在每次迭代中,您都在创建一个新变量,然后丢失您刚刚计算的内容。 您需要从每次迭代中添加此结果,因此您必须这样做 -

 for ( int i = 0 ; i < x.length ; i++){
           returnvalue = returnvalue + x[i-1]+x[i-2]+1;
    }

或者你也可以这样做 -

returnvalue +=  x[i-1]+x[i-2]+1;

请注意,在迭代版本中,returnValue 仅在循环开始之前定义一次。

【讨论】:

  • 这个有一些缺陷,最大的是当 i x 的负索引
【解决方案2】:

如何将 L 视为一个数组,然后执行以下赋值:

L(0) = 1

L(1) = 1

对于第 3 步,您必须编写一个循环来计算和存储 L[2] 到 L[30] 的值。在循环的每次迭代中,前 2 个值已经在 L 中,因此您可以直接使用它们。

【讨论】:

    【解决方案3】:

    您非常接近 - 您需要在 iterating 解决方案中保存历史记录:

    public static long iter(long x) {
        long result = 0;
        // Make a 2-length array for my history.
        long[] history = new long[2];
        for (int i = 0; i <= x; i++) {
            if (i < 2) {
                result = 1;
            } else {
                result = history[0] + history[1] + 1;
            }
            // Maintain my history.
            history[0] = history[1];
            history[1] = result;
        }
        return result;
    }
    

    【讨论】:

      【解决方案4】:

      所以我终于能够解决它:(感谢所有帮助,非常感谢)

      public class Aufgabe1 {
      
      // invokes iter as well as rec with all integers from 0 to 30 and prints the results
      // (without empty lines or other output)
      public static void main(String[] args) {
          // TODO: Implementation is your task
          int x = 0;
          while (x <= 30) {
              System.out.println(rec(x));
              x++;
          }
          long [] longArr = new long[31];
          iter(longArr);
      }
      
      public static int rec(int x) {
          if (x == 0) return 1;
          if (x == 1) return 1;
          else return rec(x - 1) + rec(x - 2) + 1;
      }
      
          public static void iter(long[] n) {
              for (int i = 0; i < n.length; i++) {
                  if (i == 0 || i == 1) {
                      n[i] = 1;
                  } else {
                      n[i] = n[i - 1] + n[i - 2] + 1;
                  }
                  System.out.println(n[i]);
              }
      
          }
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-09
        • 2021-12-24
        • 1970-01-01
        • 2021-08-23
        • 2020-08-18
        • 1970-01-01
        • 2018-10-16
        • 2016-07-21
        相关资源
        最近更新 更多