如何将迭代方法更改为递归方法

时间:2013-02-26 04:17:22

标签: java recursion

如何将以下方法从迭代更改为递归?

public int[] pascal(int[] previous) 
{

    //The row is 1 element longer than previous row
    int[] row = new int[previous.length + 1];

    //The first and last numbers in row are always 1
    row[0] = 1;
    row[row.length - 1] = 1;

    //The rest of the row can be calculated based on previous row
    for (int i = 1; i < row.length-1; i++) 
    {
        row[i] = previous[i-1] + previous[i];
    }

    return row;
}

2 个答案:

答案 0 :(得分:1)

必须通过参数传递计算的“状态”。因此,您需要的参数不仅仅是int[] previous行。

通常你想拥有2个方法,一个是接口更简单的公共方法,另一个是实际执行计算的私有方法。

在您的示例中,这两种方法类似于:

public int[] pascal(int[] previous) { ... call the next overload ... }
private int[] pascal(... all the state needed ...) { ... recursive call or return the value ... }

最直接的方法之一是传递正在计算的新行和下一个应该作为递归函数中的参数计算的位置的索引。所以,你会有:

private int[] pascal(int[] previous, int currentIndex, int[] row) { ... }

现在,您的递归函数通常有2个(或更多)个案例。为此,您将有两种情况:

  • 如果“currentIndex”超过了你需要计算的最后一个索引,我们就完成了 - 只需按原样返回行;
  • 否则,计算当前索引的值,将其放入行中,并进行递归调用以继续计算(通过判断它已完成,或再次计算并再次调用,... )

让我们编码这两种情况:

private int[] pascal(int[] previous, int currentIndex, int[] row) {
  if (currentIndex == previous.length) {
    return row;
  } else {
    // do some part of the calculation
    // and make a recursive call that would continue the calculation:
    return pascal(previous, ????, row);
  }
}

你明白为什么这是递归函数的结构吗?

好的,进入实际计算:

private int[] pascal(int[] previous, int currentIndex, int[] row) {
  if (currentIndex == previous.length) {
    return row;
  } else {
    int currentValue = previous[currentIndex - 1] + previous[currentIndex];
    row[currentIndex] = currentValue;
    return pascal(previous, currentIndex, row);
  }
}

计算完成。现在你只需要让你的“简单”函数用适当的参数调用你的递归函数:

public int[] pascal(int[] previous) {
  int rowSize = previous.length + 1;
  int[] row = new int[rowSize];
  row[0] = 1;
  row[rowSize - 1] = 1;
  return pascal(previous, 1, row);
}

就是这样。

正如您所看到的,“技巧”是在参数中保持“状态”。在此处,currentIndex与原始int i循环中的for类似。

答案 1 :(得分:0)

现在编程,你必须多次调用该函数才能得到你想要的东西。

递归函数会调用自身。这样你只需要调用一次即可得到你想要的东西。

我想你只想要三角形的一个特定行。传递给函数的唯一参数是行号。

想象一下,您已经编程了该功能,您可以将其命名为特定的行号N-1。你能编写一个使用前一个函数计算行N?

的函数

现在只需处理角落情况:第一行​​,也可能是负行号。

也就是说,使用此函数逐行显示三角形将是非常低效的!