Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用递归/helper函数计算链表的大小-Java_Java_Recursion - Fatal编程技术网

使用递归/helper函数计算链表的大小-Java

使用递归/helper函数计算链表的大小-Java,java,recursion,Java,Recursion,这里的初学者使用Java(一年级学生),我无法使用下面的函数。目标是使用递归和帮助函数来计算单链表的大小。当针对测试列表运行代码时,它会不断返回List改为[] 我一般都在努力学习Java,因此非常感谢您的帮助。多谢各位 public class MyLinked { static class Node { public Node(double item, Node next) { this.item = item; this.next = next; }

这里的初学者使用Java(一年级学生),我无法使用下面的函数。目标是使用递归和帮助函数来计算单链表的大小。当针对测试列表运行代码时,它会不断返回
List改为[]

我一般都在努力学习Java,因此非常感谢您的帮助。多谢各位

public class MyLinked {
  static class Node {
   public Node(double item, Node next) {
    this.item = item;
    this.next = next;
   }
   public double item;
   public Node next;
  }
  int N;
  Node first;

  public int sizeForward() {
   return sizeForwardHelper(first);
  }

  public int sizeForwardHelper(Node n) {
   Node current = first;
   if (current == null) {
    return 0;
   } else {
    first = first.next;
    return sizeForward() + 1;
   }
  }
如果列表中没有元素,我相信我已经将第一部分设置为返回0。我相信是第二部分设置不正确


谢谢

因为学习不要用勺子喂你很重要,我将描述一种方法,而不是提供代码

利用这一事实:

列表从任何给定节点到末端的长度为1加上从下一个节点(如果有)测量的长度

递归函数通常采用以下形式:

  • 如果终止条件为true,则返回一些值
  • 否则,返回一些值加上递归计算的值
  • 编写递归函数时,首先确定终止条件。在这种情况下,
    n==null
    是一个明显的选择,您将返回
    0
    ,因为您已经跑完了列表的末尾,并且nothing(即无节点)的长度为nothing。这也会处理空列表(当
    first
    null
    时),而不需要任何特殊代码

    否则,返回
    1
    (一个节点的长度)加上
    next
    的长度

    把这些放在一起,你就会得到答案

    --


    提示:如果使用三元表达式,递归帮助器方法的主体可以使用一个短行进行编码。

    因为学习不要用勺子喂你很重要,我将描述一种方法,而不是提供代码

    利用这一事实:

    列表从任何给定节点到末端的长度为1加上从下一个节点(如果有)测量的长度

    递归函数通常采用以下形式:

  • 如果终止条件为true,则返回一些值
  • 否则,返回一些值加上递归计算的值
  • 编写递归函数时,首先确定终止条件。在这种情况下,
    n==null
    是一个明显的选择,您将返回
    0
    ,因为您已经跑完了列表的末尾,并且nothing(即无节点)的长度为nothing。这也会处理空列表(当
    first
    null
    时),而不需要任何特殊代码

    否则,返回
    1
    (一个节点的长度)加上
    next
    的长度

    把这些放在一起,你就会得到答案

    --


    提示:如果使用三元表达式,递归帮助器方法的主体可以使用一个短行进行编码。

    而不是调用包装器函数递归调用帮助器函数。请尝试以下操作:

    public int sizeForward () {
            return sizeForwardHelper (first);
    }
    
    public int sizeForwardHelper(Node n) {
          if (n == null) // base case
              return 0;
          return sizeForwardHelper(n.next) + 1; // count this node + rest of list
    }
    

    不要调用包装器函数,而是递归调用帮助器函数。请尝试以下操作:

    public int sizeForward () {
            return sizeForwardHelper (first);
    }
    
    public int sizeForwardHelper(Node n) {
          if (n == null) // base case
              return 0;
          return sizeForwardHelper(n.next) + 1; // count this node + rest of list
    }
    

    计算列表大小的方法实际上会在过程中修改列表(使用
    first=first.next;
    将第一个元素设置为next,并且由于存在递归,因此第一个元素最终总是为null,这相当于设计中的空列表)。您的方法只工作一次,但之后列表将为空

    为了说明这一点,我在指令
    first=first.next
    并编写了以下主要代码:

    public static void main(String[] args) {
        Node n2 = new Node(2d, null);
        Node n1 = new Node(1d, n2);
        Node n = new Node(0, n1);
        MyLinked l = new MyLinked(n);
        System.out.println("The first element is: "+l.first.item);
        System.out.println("The size is: "+l.sizeForward());
        System.out.println("The first element is: "+l.first);
    }
    
    它产生:

    The first element is: 0.0
    first is set to 1.0
    first is set to 2.0
    first is set to null
    The size is: 3
    The first element is: null
    
    显然,在计算列表大小时不应修改列表。如果节点为null(空列表),helper方法应返回0,否则返回1加上列表其余部分的大小。这是代码

    public int sizeForwardHelper(Node n) {
        if (n == null)
            return 0;
         else 
            return sizeForwardHelper(n.next) +1;
    }
    

    无arg方法
    sizeForward()
    的目标就是调用助手。但是助手不应该使用它

    计算列表大小的方法实际上会在过程中修改列表(使用
    first=first.next;
    将第一个元素设置为next,并且由于存在递归,因此第一个元素最终总是为null,这相当于您设计的空列表)。您的方法只工作一次,但之后列表将为空

    为了说明这一点,我在指令
    first=first.next
    并编写了以下主要代码:

    public static void main(String[] args) {
        Node n2 = new Node(2d, null);
        Node n1 = new Node(1d, n2);
        Node n = new Node(0, n1);
        MyLinked l = new MyLinked(n);
        System.out.println("The first element is: "+l.first.item);
        System.out.println("The size is: "+l.sizeForward());
        System.out.println("The first element is: "+l.first);
    }
    
    它产生:

    The first element is: 0.0
    first is set to 1.0
    first is set to 2.0
    first is set to null
    The size is: 3
    The first element is: null
    
    显然,在计算列表大小时不应修改列表。如果节点为null(空列表),helper方法应返回0,否则返回1加上列表其余部分的大小。这是代码

    public int sizeForwardHelper(Node n) {
        if (n == null)
            return 0;
         else 
            return sizeForwardHelper(n.next) +1;
    }
    

    无arg方法
    sizeForward()
    的目标就是调用助手。但是助手不应该使用它

    我不明白为什么需要递归来计算单链表的元素。有没有明确说明在这个赋值中需要使用递归?我不明白为什么需要递归来计算单链表的元素。是否明确说明您需要在本作业中使用递归?谢谢。我尝试设置类似的,但是调用的是原始sizeForward,而不是helper。但是,当我将代码调整到上面的值时,public int sizeForwardHelper(节点n){I get a'方法结果必须包含int'类型的错误+1;表示无法访问的代码?有任何关于如何修复此问题的提示吗?Diregard,我编辑了我的if/else以使所有内容正常工作。谢谢!谢谢。我尝试设置类似的,但是调用的是原始sizeForward,而不是helper。但是,当我将代码调整为上述值时,public int sizeForward Helper(Node n){I get a'方法结果必须包含int'错误类型