所以我理解如何使用具有除void之外的其他返回类型的递归方法。通常我会在同一个方法中再次调用相同的方法(在递归情况下),同时在调用中递减或递增一些值以达到基本情况。然后在某个时刻到达基本案例并解决问题,因此它开始从每次调用返回值。沿着这些路线。
BUT
如果该方法的返回类型为void,那么您无法调用该方法,因为它不会/不能返回任何内容?我正在尝试向后写一个句子,我用for循环和resucrive方法解决了这个问题,它可以返回一个字符串值,但我不知道如果它是无效的,如果它是无效的,那就是赋值是什么要求。
编辑:我还应该提一下句子只能在参数
感谢大家提供的信息和帮助!
答案 0 :(得分:2)
递归不仅适用于返回值的方法/函数。递归仅表示方法/函数调用自身。
您必须保证至少有一个停止条件,但这不需要函数返回值。这通常通过逐步更改每次函数递归调用自身时传递的一个或多个参数来实现。当那些/那些参数满足某个条件时,你的函数不再调用自身,所有待处理的操作都会被解决。
我并不完全了解您正在尝试执行的任务,但这里是向后写入字符串的递归函数的示例。我使用PSEUDO函数,其名称希望是不言自明的。
public void writeBackwards(String str) {
// This is the negation of the stop condition, so the stop condition
// is when the string is empty, in which case this function will do
// nothing:
if (!str.isEmpty()) {
char firstCharacter = str.getFirstCharacter();
str = str.removeFirstCharacter();
writeBackwards(str); // the recursive call
// The following operation will be pending, waiting for the
// recursive call to be resolved first:
writeCharacter(firstCharacter);
}
}
答案 1 :(得分:0)
您可以使用任何可变对象作为递归函数的参数来存储结果。例如,您提到的后向句子问题可以写成:
hello
并且这样称呼
public void stringReverse(String s, int index, StringBuilder sb) {
if (index < 0)
return;
sb.append(s.charAt(index));
stringReverse(s, index - 1, sb);
}
答案 2 :(得分:0)
就像在C ++中一样,您可以传入指针,在Java中,您可以简单地将一个类对象传递给您的函数,以保存函数递归调用生成的值。反映您计算斐波那契数的问题的一个简单示例如下。
public class ComputeFibonacci {
static class Fibonacci {
public int ith;
public int value;
Fibonacci(int a, int b) {
ith = a;
value = b;
}
}
private static void fibonacci(Fibonacci result) {
if (result.ith == 1 || result.ith == 2) {
result.value = 1;
} else {
Fibonacci left = new Fibonacci(result.ith - 1, 0);
Fibonacci right = new Fibonacci(result.ith - 2, 0);
fibonacci(left);
fibonacci(right);
result.value = left.value + right.value;
}
}
public static void main(String[] args) {
// Here we compute the 10th fibonacci number
Fibonacci f = new Fibonacci(10, 0);
fibonacci(f);
System.out.println("The result is " + f.value);
}
}
祝你好运。