gpt4 book ai didi

java - 递归时不能改变变量

转载 作者:行者123 更新时间:2023-11-30 08:52:28 25 4
gpt4 key购买 nike

public static void main(String[] args) {
int[] a = { 1, 2, 3, 4, 5 };
int[] b = new int[5];
rekursiq(a, b, 0, 0, 1);
}

static void rekursiq(int[] a, int[] b, int index, int start, int check) {
if (index == b.length){
System.out.println(java.util.Arrays.toString(b));
} else {
for (int i = start; i < a.length; i++) {
b[index] = a[i];
rekursiq(a, b, index + 1, i + 1, check + 1);
}
}
}

现在我的问题是:而不是 b.length在递归底部我想放置一个 int check ,并制作check+1每次去那里,做点什么。 while (check < b.length)执行 if 语句,否则返回;但我似乎无法 1) 正确地增加值和 2) 正确地做到这一点。我不知道为什么。

我认为我最好的尝试是

static void rekursiq(int[] a, int[] b, int index, int start, int check) {
if (check > b.length) {
return;
} else {
if (index == check) {
System.out.println(java.util.Arrays.toString(b));
} else {
for (int i = start; i < a.length; i++) {
b[index] = a[i];
rekursiq(a, b, index + 1, i + 1, check + 1);
}
}
}
}

但它没有用,我希望你们中的某个人能告诉我为什么以及如何修复它。

最佳答案

当递归调用该方法时,check 的值确实会增加。但是,您遇到的问题与check 无关。

问题

让我先重复一下 abhishrp已经简要提到:在这种特殊情况下,您希望使用循环遍历数组中的所有元素或递归,但不要在递归方法中使用循环。原因如下:在递归的每一步,您都只查看一个元素:位于 index 位置的元素。

解决方案

那么,您将如何递归地复制一个数组?让我们假设您有一个源数组(在您的代码 a 中)和一个空的目标数组(在您的代码 b 中)。现在,我们知道如何复制数组的单个元素,即 destination[index] = source[index],我们可以将复制数组想象成复制第一个元素元素,然后从第二个元素开始复制子数组。请注意,知道如何复制数组中的单个元素意味着知道如何复制仅包含一个元素的数组。

这导致我们进行以下递归,稍后我们将转向代码:

  • 如果给定索引取消引用数组中的最后一个元素,则复制最后一个元素。
  • 否则,复制当前索引处的元素,并复制从下一个索引开始的子数组。

或者用Java表示:

static void copyValuesFromSourceToDestinationStartingAtIndex(int[] source, int[] destination, int index) {
if (isIndexOfLastElementInArray(index, destination)) {
destination[index] = source[index];
} else {
destination[index] = source[index];
copyValuesFromSourceToDestinationStartingAtIndex(source, destination, index + 1);
}
}

static boolean isIndexOfLastElementInArray(int index, int[] array){
return index == array.length - 1;
}

请注意,您的代码中有太多参数:参数 check 实际上只是 index,因为您想检查 index 仍在数组的边界内。我真的不知道你打算用变量 start 做什么 - 似乎你因为循环而在那里感到困惑。


旁注

还有一个小理由,说明为什么上面代码中 if 语句的 true 分支确实复制了最后一个元素,而不是在索引为超出代码中的范围。像你那样做是完全合理的。 “我们简单地知道如何复制一个空数组”的论点似乎并不像“知道如何复制单个元素意味着知道如何复制由单个元素组成的数组”那样自然。然而,我鼓励您将代码调整为“复制一个空数组”作为基本情况,因为它消除了重复,更重要的是,允许您复制空数组(上面的实现会严重失败)。


代码

我还尝试对迭代和递归方法进行比较:

public static void main(String[] args) {
int[] a = {1, 2, 3, 4, 5};
int[] copyOfAUsingIteration = copyArrayUsingIteration(a);
int[] copyOfAUsingRecursion = copyArrayUsingRecursion(a);
assert(Arrays.equals(copyOfAUsingIteration, copyOfAUsingRecursion));
assert(copyOfAUsingIteration != a);
assert(copyOfAUsingRecursion != a);
System.out.println(java.util.Arrays.toString(copyOfAUsingIteration));
System.out.println(java.util.Arrays.toString(copyOfAUsingRecursion));
}

static int[] copyArrayUsingIteration(int[] arrayToCopy) {
int[] result = new int[arrayToCopy.length];
for(int index = 0; index < result.length; index++){
result[index] = arrayToCopy[index];
}
return result;
}

static int[] copyArrayUsingRecursion(int[] arrayToCopy){
if (arrayToCopy.length == 0){
return new int[0];
} else {
int[] result = new int[arrayToCopy.length];
copyValuesFromSourceToDestinationStartingAtIndex(arrayToCopy, result, 0);
return result;
}
}

static void copyValuesFromSourceToDestinationStartingAtIndex(int[] source, int[] destination, int index) {
if (isIndexOfLastElementInArray(index, destination)) {
destination[index] = source[index];
} else {
destination[index] = source[index];
copyValuesFromSourceToDestinationStartingAtIndex(source, destination, index + 1);
}
}

static boolean isIndexOfLastElementInArray(int index, int[] array){
return index == array.length - 1;
}

关于java - 递归时不能改变变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30174254/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com