Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.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
Java 不确定我是否正确地使用链接列表进行了递归_Java - Fatal编程技术网

Java 不确定我是否正确地使用链接列表进行了递归

Java 不确定我是否正确地使用链接列表进行了递归,java,Java,我试图通过递归找到最长的字符串,虽然我得到了正确的答案,但我不确定我的方法是否是递归。我有一个链接列表在我的主要,我需要fin最长的。我的字符串最大的方法是“递归” import java.util.LinkedList; 公共类MyLinkedList扩展了LinkedList{ 公共静态字符串max=“”; 公共静态void main(字符串[]args){ //TODO自动生成的方法存根 MyLinkedList MyLinkedList=新建MyLinkedList(); myLinke

我试图通过递归找到最长的字符串,虽然我得到了正确的答案,但我不确定我的方法是否是递归。我有一个链接列表在我的主要,我需要fin最长的。我的字符串最大的方法是“递归”

import java.util.LinkedList;
公共类MyLinkedList扩展了LinkedList{
公共静态字符串max=“”;
公共静态void main(字符串[]args){
//TODO自动生成的方法存根
MyLinkedList MyLinkedList=新建MyLinkedList();
myLinkedList.add(“莎拉”);
添加(“芭芭拉”);
myLinkedList.add(“Tom”);
myLinkedList.add(“乔治”);
字符串最大值=myLinkedList.findLargestStarter();
字符串最大值1=最大值(myLinkedList,0,1);
系统输出打印项次(“最大”+最大1);
系统输出打印项次(“最大值”+最大值);
}
公共字符串findLargestStarter()
{
//最大=最大;
返回null;
}
公共静态字符串最大(MyLinkedList MyLinkedList、int lowerIndex、int upperIndex)
{
if(lowerIndex==upperIndex)//子列表的大小//为1
max=myLinkedList.get(lowerIndex);
其他的
{
max=最大(myLinkedList,lowerIndex+1,upperIndex);
if(myLinkedList.get(lowerIndex.length()>myLinkedList.get(upperIndex.length())
max=myLinkedList.get(lowerIndex);
其他的
max=myLinkedList.get(upperIndex);
}
//系统输出打印项次(最大值);
返回最大值;
}

}

不要逐行进行,您的递归方法
最大值
看起来很好,如下所示:

  • 它从else块调用自己。第一,行为满意
  • 顶部有一个终止条件(您的if块),它不会调用自身。二是行为满意

  • 我不明白为什么您在
    else
    块中对
    maximust
    方法的调用下面添加了逻辑。希望您能更好地理解这一点。

    为了使本程序更具可读性和整体效果,您可以做一些小的改进:

    • 消除全局静态变量的使用。递归函数应该返回答案作为返回参数,这真的很糟糕
    • 如果您想尝试正确地实现递归,而不是创建自己的数据结构,那么请使用java.util包中的list
    我已经整理了几行可能解决你问题的话。这种方法只是在列表每次深入时减少列表,直到其为空:

    import java.util.Arrays;
    import java.util.List;
    
    public class FindTheLongest {
    
        public static void main(String[] args) {
            final List<String> list = Arrays.asList(new String[] { "Sarah", "Barbara", "Tom", "George" });
            System.out.println(findLongestString(list, list.get(0)));
        }
    
        private static String findLongestString(List<String> list, String longestString) {
            if (!list.isEmpty())
            {
                final List<String> nextList = list.subList(1, list.size());
                final String nextLongestString = longestString.length() > list.get(0).length() ? longestString : list.get(0);
                return findLongestString(nextList, nextLongestString);
            }
            return longestString;
        }
    }
    
    导入java.util.array;
    导入java.util.List;
    公共类查找最长{
    公共静态void main(字符串[]args){
    final List=Arrays.asList(新字符串[]{“Sarah”、“Barbara”、“Tom”、“George”});
    System.out.println(findLongestString(list,list.get(0));
    }
    私有静态字符串findLongestString(列表,字符串longestString){
    如果(!list.isEmpty())
    {
    final List nextList=List.subList(1,List.size());
    final String nextLongestString=longestString.length()>list.get(0.length()?longestring:list.get(0);
    返回findLongestString(nextList,nextLongestString);
    }
    返回最长的字符串;
    }
    }
    

    请告诉我您在寻找什么。

    我们的目标是练习递归

    我更欣赏约根德拉·辛格的答案,因为它更像学者

    Petro Semeniuk的提议很有效,但这不是问题所在

    AMHO重用LinkedList不是一个好选择

    为了理解递归,为了触及它的内部行为,我们必须开发一个链表的简单实现,除了java.lang之外根本不需要导入,并逐步调试它的方法

    我建议上一节课,比如:

    public class StringNode // no generics, it's not the goal
    {
       public StringNode next;
       public String     text;
    
       public StringNode( String text )
       {
          this( text, null );
       }
    
       public StringNode( String text, StringNode next )
       {
          this.text = text;
          this.next = next;
       }
    
       public String getLongest()
       {
          String nextText = (( next == null ) ? "" : this.next.getLongest());
          return ( this.text.length() > nextText.length()) ? this.text : nextText;
       }
    
       public static void main( String[] args )
       {
          StringNode head = null;
          for( String text : new String[] { "Sarah", "Barbara", "Tom", "George" })
          {
             head = new StringNode( text, head );
          }
          System.err.println( head.getLongest());
       }
    }
    

    性能说明:新运算符不会在main()之外直接调用。

    top(您的if块)是否应该调用自身?否。这是当您到达末尾并找到递归调用特定循环的最大值时的终止标准。该最大值最终从函数返回,以向后移动循环并完成您的函数。请让我知道,如果你需要更多的投入。我将尝试通过一个简单的例子来解释。负面投票人:请添加一些注释以帮助我理解差距/问题。在代码中添加一些注释如何,以便我们了解您正在做什么。描述您尝试使用的算法。在我看来,您的代码只查看列表的前两个元素。
    public class StringNode // no generics, it's not the goal
    {
       public StringNode next;
       public String     text;
    
       public StringNode( String text )
       {
          this( text, null );
       }
    
       public StringNode( String text, StringNode next )
       {
          this.text = text;
          this.next = next;
       }
    
       public String getLongest()
       {
          String nextText = (( next == null ) ? "" : this.next.getLongest());
          return ( this.text.length() > nextText.length()) ? this.text : nextText;
       }
    
       public static void main( String[] args )
       {
          StringNode head = null;
          for( String text : new String[] { "Sarah", "Barbara", "Tom", "George" })
          {
             head = new StringNode( text, head );
          }
          System.err.println( head.getLongest());
       }
    }