首先我們要問,爲什麼我們要使用遞歸解決這個問題的。在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