将递归方法转换为迭代方法

时间:2015-04-27 15:18:14

标签: java algorithm recursion iteration

我必须创建两个执行相同操作的方法。这些方法必须计算从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;
}

我在第一个方法的主要内容中添加了这个

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 ;
}

4 个答案:

答案 0 :(得分: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仅在循环开始之前定义一次。

答案 1 :(得分:1)

如何将L作为数组处理,然后执行以下赋值:

  

L(0)= 1

     

L(1)= 1

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

答案 2 :(得分:0)

您非常接近 - 您需要在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;
}

答案 3 :(得分:0)

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

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]);
        }

    }
    }