我正在尝试学习递归,这对我来说是一个很滑的概念。我使用递归来处理原始数据类型和字符串,从而完成了许多玩具练习。但现在我转向使用递归和数组,在这里我很难过。我希望有人可以帮我解决这个问题的第一步(<)。
以下是挑战:使用递归将1D int []数组中的所有元素设置为所有0&#39; s。不允许循环。从概念上讲,我认为解决方案是:
method clearArray(int[] array)
Check for base case: Is array of size 1?
IF YES: return array
IF NO:
(-) Create array2, size one less than original array
(-) Set first element of array2 to "0"
(-) Then recursively call clearArray(array2)
在纸面上,这看起来很棒。这是实际的实现:
public class RecursiveEx{
public static void main(String[] args){
int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8 };
printArray(clear(arr));
}
public static int[] clearArray(int[] arr){
if(arr.length==1){
return arr;
}
else{
int[] arr2 = new int[arr.length-1];
arr2[0]=0;
return clearArray(arr2);
}
}
返回一个大小为1的数组,设置为&#34; 0&#34;。不好。问题在于,当代码递归地将数组切割为一个元素时,它不会将原始数组构建回原始大小;我不知道如何附加子阵列。
使用String这很容易。但String对象允许使用易于使用的串联和子串方法。我无法弄清楚数组等价物是什么。
完全披露:我正在罗格斯大学学习Java 101课程,是的,这是他们使用递归和数组为我们提供的几个编程练习中的第一个。它不是为了信用。我希望如果有人能帮助我开始这个初步练习,我可以看到我出错的地方,然后淘汰其他人。
有没有人有一些建议或建议?任何事情都会受到赞赏。
非常感谢! -RAO
答案 0 :(得分:1)
最好的方法是将数组保留为参数,因此您始终拥有其引用,以及当前索引以跟踪最后清除的元素。
我没有测试过这个方法,但它是这样的:
void clearArray(int[] arr, int index) {
if (index >= 0) {
arr[index] = 0;
clearArray(arr, index - 1);
}
}
您拨打电话clearArray(arr, arr.length - 1);
答案 1 :(得分:1)
为此,我建议您递归调用一个index
值的辅助函数(每次递增),以及目标数组。基本情况是你的索引等于数组的长度 - 不做进一步的更改,然后返回。
代码可能类似于:
import java.util.Arrays;
public class RecursiveEx {
public static void main(String[] args) {
int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8 };
clearHelper(0, arr);
System.out.println(Arrays.toString(arr));
}
public static void clearHelper(int index, int[] arr) {
if (arr.length == index) {
return;
}
arr[index] = 0;
clearHelper(index + 1, arr);
}
}
不使用循环的另一种厚颜无耻的方式:arr = Arrays.stream(arr).map(i -> 0).toArray();
答案 2 :(得分:1)
一般来说,像递归一样重新思考你的想法
话虽如此,您的输入是一个数组,并且数组具有length
属性,您可以将它们编入索引。如果你保持对整个数组的引用,并在任一端开始索引,那么你可以通过递增/递减索引,并将该位置的数组设置为零来有效地向另一端递归。
在伪代码中(在数组中向后)
func clearArray(A[], n):
if n < 0:
return
A[n] = 0
clearArray(A[], n - 1)
arr = A[]
clearArray(arr, arr.length)