Java数组递归
本作业的目的是学习递归方法。对于这个特殊问题,我需要打印Java数组递归,java,recursion,Java,Recursion,本作业的目的是学习递归方法。对于这个特殊问题,我需要打印列表的值,每行一个。我需要完成的方法的框架无法更改,如下所示: public void list (String[] list) { } 说明中说,helper方法可能会使其更易于编写。以下是我的助手方法的内容: public void print(String[] list, int index) { if (index < list.length) { System.out.printl
列表的值,每行一个。我需要完成的方法的框架无法更改,如下所示:
public void list (String[] list) {
}
说明中说,helper方法可能会使其更易于编写。以下是我的助手方法的内容:
public void print(String[] list, int index) {
if (index < list.length) {
System.out.println(list[index]);
print(list, index+1);
}
}
public void打印(字符串[]列表,int索引){
如果(索引<列表长度){
System.out.println(列表[索引]);
打印(列表,索引+1);
}
}
我只想通过list方法调用print方法进行测试。我知道分级是通过脚本完成的,所以我同样不能更改list方法的返回类型或参数。请原谅我的格式错误,并提前感谢您的帮助 如果我这样做,我会使用名为print()
或类似名称的助手方法
在考虑程序逻辑方面,考虑您需要做什么:
有一个助手方法print()
:
- 在新行上打印列表中的当前项
- 然后它调用一个函数来打印列表中的下一个和后续项目,每个项目都在新行上
你认为第二个函数是什么?提示:它是递归的…如果我这样做,我会使用名为print()
或类似名称的助手方法
在考虑程序逻辑方面,考虑您需要做什么:
有一个助手方法print()
:
- 在新行上打印列表中的当前项
- 然后它调用一个函数来打印列表中的下一个和后续项目,每个项目都在新行上
你认为第二个函数是什么?提示:它是递归的…有。你将从阅读这些文章中受益匪浅。首先阅读课本,然后继续这些例子。你将从阅读这些文章中受益匪浅。首先阅读你的课本,然后继续这些例子,我不会给你直接的答案,因为你不会从中学到任何东西。可以创建变量来存储当前深度。创建getter和setter助手方法以增加递归的深度。您的方法列表将使用相同的数组调用自身,但只有在您检查深度是否大于数组大小之后。不要忘记在每次调用时增加递归的深度。我不会直接回答您,因为您不会从中学到任何东西。可以创建变量来存储当前深度。创建getter和setter助手方法以增加递归的深度。您的方法列表将使用相同的数组调用自身,但只有在您检查深度是否大于数组大小之后。不要忘记在每次调用时增加递归的深度。想想这样一个递归解决方案:给定一堆东西(如列表)对其中一个东西(如列表的第一个元素)做一些事情,然后将其余的东西传递给处理其中一个东西的同一个解决方案
提示:您需要考虑解决方案在什么都没有给出的情况下会做什么
提示2:不要在每次递归时“切碎”数组,只需记下你在数组中的位置。想想这样一个递归解决方案:给定一堆东西(如列表),用其中一个东西(如列表的第一个元素)做些什么,然后将其余内容传递给处理其中一个内容的同一个解决方案
提示:您需要考虑解决方案在什么都没有给出的情况下会做什么
提示2:不要每次递归都“切碎”数组,只需记下您在数组中的位置。让我们从头开始:
您可能已经知道递归函数是一个调用自身的函数。如果函数每次运行时都调用自身,那么最终将进入一个无限循环。因此,始终确保函数知道何时停止调用自己是很重要的
我们怎样才能做到这一点?函数体不会在调用之间更改,因为它是在编译时设置的。然而,改变的是函数的输入。无论何时编写递归函数,都需要包含在满足特定条件时避免递归调用的逻辑
在您的示例中,函数的输入是一个字符串数组。知道何时停止递归调用的一种方法是每次向函数传递一个较小的数组,并在有空数组时停止。在像C这样的语言中,数组作为指针公开,这样做会更好,但在Java中,这样做效率很低,因为每次都必须创建一个新数组
更好的解决方案是维护一个指向列表中当前位置的索引(这就是为什么需要一个helper函数来添加额外的参数)。每次调用时,只需打印当前索引处的字符串并增加索引。当索引不再在数组中时,就完成了
如果您真的想很好地理解递归,我建议您学习函数式语言,如Lisp、Haskell或ML。函数式语言避免可变状态(更改变量的值),因此它们不使用循环之类的东西(因为每次迭代都需要更新循环计数器)。所以他们用递归来实现循环!例如,在Java中,我们可能有:
for (int i = 0; i < 10; i++) {
System.out.println("Loop index: " + i);
}
这里的重要区别在于,我们每次都将一个新值传递到循环函数中,而不是更改count的值(鉴于上述OCaml代码,这实际上是不可能的)。让我们从头开始:
您可能已经知道递归函数是一个调用自身的函数。如果有的话
let times = 10 in
let rec loop count =
if count = times then
printf "Loop index: %d" count ;
loop (count + 1)
;;
public void list(String[] list) {
for(int index = 0; index < list.length; index++) {
System.out.println(list[index]);
}
}
public void list(String[] list) {
for(int index = 0; index < list.length; index++) {
list(list, index);
}
}
public void list(String[] list, int index) {
System.out.println(list[index]);
}
static void traverse(int []x)
{
if(x.length == 0)
return;
traverse( Arrays.copyOf(x,x.length- 1));
System.out.println(x[x.length-1]);
}