【问题标题】:Recursively Counting A Two Part List with Head/Tail values递归计算具有头/尾值的两部分列表
【发布时间】:2015-06-11 02:07:11
【问题描述】:

我有一个家庭作业到期,我不知道如何开始, 逻辑是这样的,用字符串实现一个两部分列表,列表的前面是头,它总是保存列表的第一个值,列表的其余部分被识别为尾。 我必须通过每次计算头部并将其切掉并从尾部分配一个新头部来递归地找出列表中有多少元素。该列表可以是随机字符的输入。

我需要使用 java.util.list 功能吗? 我可以只使用字符串生成器吗? 我将如何分配/设置头部和尾部的值?

【问题讨论】:

  • 你会接收头部和尾部作为这个递归函数的输入吗?
  • 是的,他特别提到这不是一个链表,他说它只是一个两部分列表,头部作为列表的第一个字符,尾部是其余字符
  • 是的,我会从扫描仪收到它
  • 哇,我在 C 方面想的太多了,哈哈。使用指针很容易做到这一点!
  • 所以,还有一个更明确的评论——@linyu21,你会编写代码来读取输入吗?你可以构建数据结构吗?

标签: java list recursion


【解决方案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

通知 headtail 已增加。同样,字符串“ello”不是空的,所以我们将计数加 1(请记住,这是一个新的函数调用,所以计数一开始是 0)。然后我们得到修剪后的字符串的长度。

你重复这个直到你遇到以下情况:

     h v
   hello
        ^ t

现在字符串不是空的,所以我们再次将计数加 1。我们再次将修剪后的字符串传递给递归调用。

但是,这一次,字符串是空的,因为head 不包含任何字符。在这种情况下,我们返回 0,因为没有要计算的内容。

现在我们将返回递归调用。我们从上次调用中返回 0,因此我们将其添加到我们在当前调用中计数的 1 中得到 1。

我们从中返回 1 并将其添加到我们在上一次调用中获得 2 的 1 中。

返回2,加1得3;返回3,加1得到4;最后,返回 4 并将其与我们计算的第一个 1 相加,得到字符串的长度 5。

希望这是有道理的!祝你好运。

【讨论】:

    【解决方案2】:

    这是我的代码,但我只是希望能帮助你思考。 问题是你的作业,所以我希望你不要只是抄袭。

    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());
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2018-08-11
      • 2017-04-10
      • 2019-10-28
      • 2011-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-13
      • 2020-01-01
      相关资源
      最近更新 更多