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

时间:2014-11-11 20:03:17

标签: java recursion iteration

我练习了两次写一个函数,一次递归,一次迭代,这将产生以下输出:

private static void printSequence(int n)

printSequence(3);

1
12
123
12
1

我的迭代解决方案如下:

for (int i = 1; i < 2 * n; i++) {
    for (int j = 1; j <= (i > n ? 2 * n - i : i); j++) {
        System.out.print(j);
    }
    System.out.println();
}

迭代方式非常简单,但我不知道如何将其作为递归调用来处理。

有关如何解决此问题的任何提示?

编辑:方法签名由于单元测试而得以修复

2 个答案:

答案 0 :(得分:4)

您的代码应如下所示

public static void main(String[] args) {
    recusiveFunction(1,10); // First parameter is the iteration number and 2 is total times.
}

private static void recusiveFunction(int iteration ,int total) {
    String str="";
    for(int i=1;i<=iteration;i++){ // this loops creates what it needs to print 1 or 12 or 123
        str+=i;
    }
    if(iteration<total/2){
        System.out.println(str);
        recusiveFunction(++iteration,total);
    }
    System.out.println(str);
}

输出:

1
12
123
1234
12345
1234
123
12
1

这是如何工作的我们将字符串存储在我们想要打印的变量中,但是我们继续调用函数并增加字符串,迭代次数不到一半。然后一旦它达到一半就开始返回堆栈跟踪,这样它就会按递减顺序给出返回输出。


编辑:

正如pshemo所说,修改了一些代码以完全没有循环:

public static void main(String[] args) {
    recusiveFunction(1,10,"");
}

private static void recusiveFunction(int iteration ,int total, String str) {
    str+=iteration;
    if(iteration<total/2){
        System.out.println(str);
        recusiveFunction(++iteration,total,str);
    }
    System.out.println(str);
}

输出:

1
12
123
1234
12345
1234
123
12
1

替代方式:

public class Main {
    private  static int iteration=1;
    private  static String str ="";

    public static void main(String[] args) {
        printSequence(10);
    }

    private static void printSequence(int total) {
        if(iteration<=total){
            str+=iteration;
            System.out.println(str);
            iteration++;
            printSequence(total);
        }
        if(2*total - iteration >0) {
            str = str.substring(0, 2 * total - iteration);
            iteration++;
            System.out.println(str);
        }
    }
}

输出:

1
12
123
1234
12345
123456
1234567
12345678
123456789
12345678910
123456789
12345678
1234567
123456
12345
1234
123
12
1

答案 1 :(得分:1)

提示:您的主要递归方法看起来像

void recursiveMethod(int iter, int max){
    if iteration<max
        print 1..iter
        recursiveMethod(iter+1, max)
        print 1..iter
    else
        print 1..iter
}

您可以编写额外的递归方法来处理范围1..n

中的打印数字
        print 1..iter
        recursiveMethod(iter+1, max)
        print 1..iter

应该处理打印

1
..
1

但也会调用recursiveMethod(iter+1, max)来填充..部分

12
..
12

等等,直到我们需要打印的iteration==max

的情况
123..max