我将创建一个Book类的数组,我不相信Book类的内容,但我已经实现了Comparable,尽管在这个确切的例子中并不需要使用它。我需要返回一个String字符串。在过去的示例中,我们总是这样做,因此它是无效的但使用System.out.println。我对整个递归的掌握程度很低,所以如果有人能提供帮助,我会非常感激。谢谢
答案 0 :(得分:0)
递归不是解决此问题的正确策略。这听起来像是在寻求家庭作业帮助,所以我建议您在学校学习TA或其他资源,以便更好地理解问题的背景。既然你提到过:打印数组不需要实现Comparable
。如果您打算排序数组,则需要Comparable
。
那就是说,这是你需要的组件:
您的Book
类需要字符串表示。在Java中,规范地使用toString
方法对其进行编码:
class Book
{
private String title;
// ...other Book methods defined here...
public String toString()
{
return this.title; // Or whatever the correct string representation of your Book is.
}
}
我假设你已经初始化了Book
的数组,比如你的main
函数。通常,您会迭代地打印列表。它简单得多。请参阅此答案:How to print out individual Strings from Iterable<String>。
但是,您的问题特定于递归。递归函数总是需要两个元素:
递归迭代列表在函数式编程中很常见,其中常见的基本情况是空列表。 Java数组不适合这种模式,尽管List
之类的LinkedList
实现是一些for
。也就是说,我们可以通过使递归步骤递增计数器来使用数组。与在public String stringifyBooks(Book[] books, int currentIndex)
{
// From https://stackoverflow.com/questions/47169798/how-to-print-an-array-of-objects-using-recursion
if (currentIndex >= books.length || currentIndex < 0)
{
// Base case
return "";
}
else
{
// Recursive step
return books[currentIndex].toString() + ", " +
stringifyBooks(books, currentIndex + 1);
}
}
循环中迭代列表相比,这几乎没有优势,并且具有容易出现堆栈溢出的主要缺点。但是,你要求递归......
stringifyBooks
现在,您可以使用Book
数组和初始索引调用", "
,您将获得从该索引开始的所有书籍串。如果您传递的初始索引大于书籍数组的长度,或者书籍是否为空数组,会发生什么?
当您亲自尝试时,您可能会注意到此解决方案会产生尾随for
。为避免这种情况,您可以尝试(a)调整基本情况(或添加第二个“基本情况”),或者您可以(b)调整递归步骤以确定何时使用递归函数调用命中基本情况(提示) :在递归步骤中检查基本案例和帐户返回的值。
使用递归会受到Java堆栈大小限制的影响。在很长的一系列书籍(比如10,000个)上尝试它,你可能会遇到这些限制。而且,所有字符串连接的成本都非常大。顺便提一下,如果您在迭代算法(即使用StringBuilder
循环的算法)中累积了字符串,您将支付该费用。出于这个原因,Java提供了内置的StringBuilder
。看看你是否可以修改上面的代码,在递归步骤中为每本书提供append
和+
,而不是使用void
运算符在每个递归步骤中连接字符串。 (请注意,此修改意味着stringifyBooks将返回String
而不是StringBuilder
- 您的List<Book>
参数最终将成为您的返回值。)
最后,如果您打算使用Book[]
而不是List
,您可以构造一个递归函数,其中:(1)基本案例检查isEmpty
的{{1}函数并返回""
; (2)递归情况创建列表中第一个元素的字符串,删除第一个元素,调用列表上的递归函数,然后返回第一个元素的字符串+递归函数调用的结果。 (或使用StringBuilder
执行相同的操作。)如果执行此操作,则会删除currentIndex
变量。请记住,这会破坏您的书籍列表,因此如果您在使用该功能后需要它,则需要在调用递归函数之前克隆它。
答案 1 :(得分:-1)
要从方法标题中的方法返回一个字符串:
public String getName(){
return this.name;
}
如果要返回Object的String表示,则约定是使用.toString()
方法。 String.format()
对此非常有帮助。
public String toString(){
return String.format("Name: %s Number of pages: %d", this.name, this.numPages);
}
编辑:
使用递归打印这些对象的数组:
public static String arrayAsString(Book[] books, int startIndex){
if(startIndex > books.length - 1) return null;
String toAppend = arrayAsString(books, startIndex + 1);
if(toAppend == null) return books[startIndex].toString();
else return books[startIndex].toString() + " " + toAppend;
}