首先我们要问,为什么我们要使用递归解决这个问题的。在Introduction to Computer Science - Java页面,我们可以发现一些特点,它描述递归解决方案:
- ,我们有一个解决方案和一个返回值的简单的基本情况。
- 让我们的问题更接近基本案例的一种方法。即一种方式 砍掉问题的一部分,以得到一个更简单的问题。
- 递归调用将简单问题传递回 方法。
对我来说,你的问题根本不符合这个特性。
但是,好吧,你不想这样做 - 你必须。
首先你应该考虑模型,它可以代表你的问题。我创建了简单的Line
类,它存储行号和行。
class Line {
private int number;
private String text;
public Line(int number, String text) {
this.number = number;
this.text = text;
}
public int getNumber() {
return number;
}
public String getText() {
return text;
}
@Override
public String toString() {
return number + " : " + text;
}
}
然后,你应该使用简单循环创建解决方案。
class LoopSearcher {
public List<Line> findLines(String text, List<String> lines) {
List<Line> matchLines = new ArrayList<Line>();
int index = 0;
for (String line : lines) {
index++;
if (line.contains(text)) {
matchLines.add(new Line(index, line));
}
}
return matchLines;
}
}
您可以用这种方式进行测试:
List<String> lines = IOUtils.readLines(new FileInputStream(new File(
"D:/test.txt")));
List<Line> loopLines = new LoopSearcher().findLines("test", lines);
for (Line line : loopLines) {
System.out.println(line);
}
现在,我们有循环的解决方案,我们可以修改成递归解决方案:
class RecursiveSearcher {
LinkedList<Line> matchLines = new LinkedList<Line>();
public List<Line> findLines(String text, List<String> lines) {
if (lines.isEmpty()) {
return matchLines;
}
int number = lines.size() - 1;
String line = lines.remove(number);
if (line.contains(text)) {
matchLines.addFirst(new Line(number + 1, line));
}
return findLines(text, lines);
}
}
你可以测试它这样:
List<String> lines = IOUtils.readLines(new FileInputStream(new File(
"D:/test.txt")));
List<Line> recursiveLines = new RecursiveSearcher().findLines("test",
lines);
for (Line line : recursiveLines) {
System.out.println(line);
}
就像你看,我有创建方法与将参数:
- 文本 - 文本,我们要在每行找到
- 线 - 文件中的所有行的列表。当然,您可以提供原始
String
,它可以表示所有文件内容。
“家庭作业”可能不是标签的好主意。 – melvynkim 2013-03-10 01:25:47
首先解释'getTheWord()'的作用。 – 2013-03-10 01:25:58
另外,将字符串与int值0进行比较意味着什么?你如何从一个字符串中减去1? (这些是你的代码不能编译的原因,但是要弄清楚如何解决这些问题,你需要回答我以前的问题。) – 2013-03-10 01:27:06