当前位置: 首页 > 知识库问答 >
问题:

java中递归的澄清

柳宪
2023-03-14

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

原始尝试

    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个答案

东方灵均
2023-03-14

以下是以相反顺序打印数组的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);
    }
}
诸葛彦
2023-03-14

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

当这不是真的时,您需要将问题分解成一个较小的版本(可以通过调用printBackwards来解决)以及完成问题所需的任何东西。您已经有一个调用将打印A[i 1... j](用于i的原始值)。因此,剩下的就是打印A[i]。弄清楚它应该在数组的其余部分之前还是之后打印,然后就万事俱备了。

伍玮
2023-03-14

在我看来,解决这个问题不需要使用递归。你可以用简单的循环来做。

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到100之间的任何值可以得到的更改可能性的数量。我不确定项目中的2个方法做了什么(代码中的粗体部分),所以有人能给我解释一下吗?我对Java还很陌生。 我包含了上下文的整个代码,但不确定是否有必要。

  • 问题内容: 递归是一种“分而治之”的样式,它在变小的同时会拆分(Tree数据结构),如果发现违规,我希望它完全中断,这意味着中断所有递归路径并返回true。这可能吗? 问题答案: 您可以返回错误代码,或修改一些全局变量,以便每个递归实例都知道可以“杀死自己”。 某种东西。

  • 问题内容: 如何在Java目录中递归列出所有文件?框架是否提供任何实用程序? 我看到了很多hacky的实现。但是框架或nio都没有 问题答案: Java 8提供了一个不错的流来处理树中的所有文件。 这提供了一种遍历文件的自然方法。由于它是流,因此你可以对结果进行所有不错的流操作,例如限制,分组,映射,提早退出等。 更新:我可能会指出,还有Files.find带有BiPredicate,如果需要检查

  • 代码运行良好。只是我不明白。在递归部分有困难的。在此部分中:我的想法是,首先它将一直执行直到一个阈值。则它将执行一次。因此只会被赋值一次。显然那不是真的。 对我来说,困难的部分是在方法中,做什么?在方法中,、做什么?

  • 问题内容: 我是Java开发的新手。我有一个关于Java递归导入的快速问题。 假设包“ pkg”包含以下内容 A级 程序包B(依次包含B1类) 程序包C(依次包含C1类) 如果使用为什么我不允许从包“ B”和“ C”中导入类? 我想了解Java不允许我进行递归导入的背后原理。 问题答案: 您的问题措辞不好,因为如果您愿意,那么您当然可以从包和中导入类。也就是说,这样做非常好: 但是我假设您真正要问

  • 程序调用自身的编程技巧称为递归(recursion),它做为一种算法在程序设计语言中广泛应用。 Java 支持递归,在 Java 编程中,递归是允许方法调用自身调用的属性。调用自身的方法称为是递归的。 递归的典型例子是数字的阶乘。数字 N 的阶乘是 1 到 N 之间所有整数的乘积。例如 3 的阶乘就是 1×2×3。下面的程序使用递归来计算数字的阶乘。 该程序产生的输出如下所示: 3的阶乘是 6 4