2

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

原创尝试

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

但是,这甚至是有效的递归吗?还是有更好的方法通过它?这是我从写出来看它时唯一能弄清楚的方法。

4

3 回答 3

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]);
        }
    }
}
于 2012-05-16T02:05:02.053 回答
1

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

如果这不是真的,您需要将问题分解为制作一个较小的版本(可以通过调用 printBackwards 来解决)以及完成问题所需的任何内容。您已经有一个将打印 A[i+1..j] 的调用(对于 i 的原始值)。因此,剩下的就是打印 A[i]。弄清楚它是否应该在数组的其余部分之前或之后打印,你就准备好了。

于 2012-05-16T01:51:36.360 回答
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);
    }
}
于 2012-05-16T02:41:08.060 回答