我有一份家庭作业,我不知道怎么开始, 逻辑是这样的,用字符串实现一个两部分列表,列表的前面是head,它总是保存列表的第一个值,列表的其余部分被识别为尾部。 我必须递归地找出列表中有多少元素,每次计算头部并将其砍掉并从尾部分配新头部。该列表可以是随机字符的输入。
我是否需要使用java.util.list功能? 我可以使用字符串生成器逃脱吗? 我如何分配/设置头部和尾部的值?
答案 0 :(得分:1)
只有你的教授知道你能做什么,能不能逃脱,但就递归解决方案而言,你可以这样思考:
考虑这个输入字符串:
Hello World!
以编程方式,你想要这样想:
head v
Hello World!
^ tail
这个想法是,只要head
包含一个字符,我们就可以在计数中加1。
我们甚至不担心tail
,因为在经过一定数量的递归调用后,我们将传递一个字符作为尾部,这只是一个头而不是尾巴。然后我们将传入空尾,你的递归函数将触及它的基本情况并返回0,因为在空字符串中没有任何内容可以计算。
基本上,你有几件事要做。
首先,检查字符串是否为空;如果是,我们点击基本情况,我们可以返回0,因为没有长度。
如果字符串不是为空,则需要添加到计数中。这会计算" head"中的单个字符。字符串的一部分。
最后,您需要将尾部的长度添加到计数中。这是一个递归调用。考虑一下:如何从字符串中删除第一个字符?一旦你弄清楚如何做到这一点,你可以将结果,修剪下来的字符串传递给递归函数调用。
你的尾巴长度为1 +。
取一个较短的字符串:
h v
hello
^ t
我们已经调用了该函数,我们确定该字符串不是空的,因此count从0变为1来计算head
中的字符数。
现在我们想要传递一个修剪过的字符串并获得它的长度。所以我们做这样的事情:
h v
hello
^ t
注意head
和tail
已递增。再次,字符串" ello"不是空的,所以我们在计数中加1(记住这是一个新的函数调用,所以计数首先是0)。然后我们得到修剪过的字符串的长度。
你重复这个,直到你遇到以下情况:
h v
hello
^ t
现在字符串不是空的,所以我们再次向计数加1。我们再次将修剪后的字符串传递给递归调用。
但是,这次,字符串为空,因为head
不包含任何字符。在这种情况下,我们返回0,因为没有任何事情需要计算。
现在我们重新回到递归调用。我们从最后一次通话中返回0,因此我们将其添加到我们在当前通话中计算的1以获得1。
我们从那里返回1并将其添加到我们在上一次调用中获得的1以获得2.
返回2,加1获得3;返回3,加1得到4;最后,返回4并将其添加到我们计算的第一个1以获得字符串的长度,5。
希望这是有道理的!祝你好运。
答案 1 :(得分:0)
这是我的代码,但我希望能帮助你思考。 问题是你的功课,所以我希望你不要复制它。
public class TwoPartList {
private String value;
private TwoPartList others;
public TwoPartList(String value, TwoPartList others) {
this.value = value;
this.others = others;
}
public TwoPartList(String[] array) {
int len = array.length;
if (len > 0) {
this.value = array[0];
this.others = null;
}
TwoPartList pre = this;
for (int i = 1; i < len; i++) {
TwoPartList next = new TwoPartList(array[i], null);
pre.setOthers(next);
pre = next;
}
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public TwoPartList getOthers() {
return others;
}
public void setOthers(TwoPartList others) {
this.others = others;
}
public String head() {
return getValue();
}
public TwoPartList tail() {
return getOthers();
}
public void print() {
if (this != null) {
System.out.print(value + " ");
if (this.others != null) {
this.others.print();
} else {
System.out.println();
}
}
}
public static void main(String[] args) {
String[] array = new String[] { "a", "b", "c", "d" };
TwoPartList list = new TwoPartList(array);
list.print();
System.out.println(list.head());
list.tail().print();
System.out.println(list.tail().head());
}
}