如何制作迭代方法的递归版本?

时间:2010-03-27 23:57:46

标签: java recursion iteration

我正在尝试用Java编写一个递归函数来打印数字1到n。 (n是您发送函数的参数。)迭代解决方案非常简单:

public static void printNumbers(int n){
    for(int i = 1; i <= n; i++){
         System.out.println(i);
         i++;
    }

作为一名新程序员,我很难弄清楚这种方法的递归版本是如何工作的。

6 个答案:

答案 0 :(得分:3)

您正在使用从i=1迭代到n的for循环。正如你想用递归做的那样,更容易传递n而不是i n,我们只是颠倒了整个事情,所以我们算了向下n1。为了保持打印的顺序,我们首先调用递归函数并在执行后打印数字:

public static void printNumbers ( int n )
{
    if ( n > 0 )
    {
        printNumbers( n - 1 ); // n - 2, if the "i++" within the for loop is intended
        System.out.println( n );
    }
}

对于简单的迭代 - &gt;递归转换很容易将循环更改为这样的格式:

public static void printNumbers ( int n )
{
    int i = 1;
    while ( i <= n )
    {
        System.out.println( i );
        i++; // i += 2, if the "i++" within the for loop is intended
    }
}

现在您可以轻松地将其转换为递归函数:

public static void printNumbers ( int n, int i )
{
    if ( i <= n )
    {
        System.out.println( i );
        i++; // i += 2, if the "i++" within the for loop is intended
        printNumbers( n, i );
    }
}

其他一切都是优化。

答案 1 :(得分:1)

递归版本需要两个参数(ni),因此请将其作为辅助非公共方法,并从public方法调用它以开始递归:

static void auxPrintNumbers(int n, int i){
    if(i <= n) {
        System.out.println(i);
        auxPrintNumbers(i + 1);
    }
}

public static void printNumbers(int n){
    auxPrintNumbers(n, 1);
}

答案 2 :(得分:1)

您的迭代版本存在一些问题:您在i语句中迭代for两次,然后在循环结束时再次;你也应该让i < n成为循环的结束条件。

要回答你的问题,显然递归函数必须打印出当前数字,如果当前数字尚未达到n,则再次调用自身 - 所以它必须取当前数字(我们正在调用{迭代版本中的{1}}作为参数 - 或者类需要将其作为实例变量保存,但我会坚持使用参数。

答案 3 :(得分:1)

根据你的函数打印从1到n的每个奇数,递归函数看起来像这样:

public static void printNumbersRecursive(int n)
{
  if (n % 2 == 0) printNumbersRecursive(n - 1);
  else if (n > 0)
    printNumbersRecursive(n - 2);
  System.out.println(n);
}

如果是错误,并且您想打印从1到n的每个数字,那么:

public static void printNumbersRecursive(int n)
{
  if (n > 0)
    printNumbersRecursive(n - 1);
  System.out.println(n);
}

答案 4 :(得分:1)

班级版本(只是为了好玩):

class R {

  private final int n;

  public R (final int n) {
    if (n <= 0) {
      throw new IllegalArgumentException("n must be positive");
    }
    this.n = n;
  }

  @Override
  public String toString () {
    final StringBuilder sb = new StringBuilder();
    if (this.n > 1) {
      sb.append(new R(this.n - 1).toString());
    }
    sb.append(this.n).append(" ");
    return sb.toString();
  }
}

用作:

System.out.println(new R(10));

答案 5 :(得分:0)

public static void printNumbers(int n){
   if( n > 1 ){
      printNumbers(n - 1);
   }
   System.out.println(n);
}

此函数递归调用自身,直到达到n = 1.从这一点开始,所有值都按正确的顺序打印:1,2,3,...