用java中的递归来澄清

时间:2012-05-16 01:32:07

标签: java recursion

所以这整个时间我都认为我的递归问题是理解案例。事实证明,我的问题是理解递归案例的价值。例如,向后打印一部分数组。

原创尝试

    public static void printBackwards(int i, int j, char[] A){
        if(i == j){
            System.out.println(A[i]); 
        }
        else{
            printBackwards(i+1,j,A);
        }

    }

正在进行的尝试

    public static boolean printBackwards(int i, int j, char[] A){
    if(i == j){
            System.out.println(A[i]);
            return true;
    }
    else{
            if(printBackwards(i+1,j,A) == true){
                System.out.println(A[i]);
                return true;
            }
            else{
                printBackwards(i+1,j,A);
            }
    }
    return false;
    }

然而,这是否是有效的递归?或者有更好的方法吗?当我把它写出来的时候,这是我能想出来的唯一方法。

3 个答案:

答案 0 :(得分:2)

对于我的看法,解决这个问题不需要使用递归。你可以通过简单的循环来完成它。

public class PrintBackwards {

    public static void main(String[] args) {
        char[] a = new char[] {'A', 'B', 'C', 'D'};

        for(int i = a.length - 1; i >= 0; i--) {
            System.out.println(a[i]);
        }
    }
}

这背后有什么理由使用递归吗?如果没有,像上面的例子那样做得更快。

如果你想使用递归,我希望这个例子可以让你比你更容易理解。

public class PrintBackwards {

    private static char[] a = new char[]{'A', 'B', 'C', 'D'};

    public static void main(String[] args) {
        printBackwards(0);
    }

    public static void printBackwards(int i) {
        if (i < a.length) {
            printBackwards(++i);
            System.out.println(a[i - 1]);
        }
    }
}

答案 1 :(得分:1)

首先询问“我什么时候可以立即解决问题(没有递归呼叫)?”。在这种情况下,当区域只有一个元素时 - 这是你的基本情况。

如果不是这样,你需要将问题分解为制作一个较小的版本(可以通过调用printBackwards来解决)以及完成问题的剩余部分。您已经有一个打印A [i + 1..j]的呼叫(对于i的原始值)。因此,剩下的就是打印A [i]。弄清楚它是否应该在阵列的其余部分之前或之后打印,并且你已经完成了设置。

答案 2 :(得分:1)

以下是以相反顺序打印数组的Java代码:

public class TestProgram {

    private int[] a = {4, 2, 7, 1, 9, 5, 8};

    public static void main(String[] args) {
        TestProgram p = new TestProgram();
        p.print(a.length - 1);
    }

    public void print(int i) {
        // the anchor of the recursive method
        // it indicates that we are done printing array
        if (i < 0) 
            return;

        // print the current value
        System.out.printf("%d ", a[i]);

        // recursively call print() method
        print(i - 1);
    }
}