所以这整个时间我都认为我的递归问题是理解案例。事实证明,我的问题是理解递归案例的价值。例如,向后打印一部分数组。
原创尝试
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;
}
然而,这是否是有效的递归?或者有更好的方法吗?当我把它写出来的时候,这是我能想出来的唯一方法。
答案 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);
}
}