所以这段时间我一直认为递归的问题是理解案例。事实证明,我的问题是理解递归案例的值。例如,向后打印数组的一部分。
原始尝试
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;
}
然而,这是一种高效的递归吗?还是有更好的办法?这是我从写出来的时候看出来的唯一方法。
以下是以相反顺序打印数组的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);
}
}
首先问“我什么时候可以立即解决问题(没有递归调用)?”。在这种情况下,当区域只有一个元素时——这是基本情况。
当这不是真的时,您需要将问题分解成一个较小的版本(可以通过调用printBackwards来解决)以及完成问题所需的任何东西。您已经有一个调用将打印A[i 1... j](用于i的原始值)。因此,剩下的就是打印A[i]。弄清楚它应该在数组的其余部分之前还是之后打印,然后就万事俱备了。
在我看来,解决这个问题不需要使用递归。你可以用简单的循环来做。
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