1

再帰を使用して最長の文字列を見つけようとしていますが、正しい答えが得られますが、メソッドが再帰であるかどうかはわかりません。メインにリンクされたリストがあり、それを最も長く見つける必要があります。私の文字列最大のメソッドは「再帰」です

import java.util.LinkedList;


public class MyLinkedList extends LinkedList<String> {
  public static String max="";

public static void main(String[] args) {
    // TODO Auto-generated method stub

    MyLinkedList myLinkedList = new MyLinkedList();
    myLinkedList.add("Sarah");
    myLinkedList.add("Barbara");
    myLinkedList.add("Tom");
    myLinkedList.add("George");
    String largest = myLinkedList.findLargestStarter();
    String largest1= largest( myLinkedList,0, 1);
    System.out.println("Largest "+largest1);
    System.out.println("max "+max);

}


public String findLargestStarter()
{
    //largest=max;
    return null;


}

public static  String largest(MyLinkedList myLinkedList, int lowerIndex, int upperIndex)
{
     if(lowerIndex == upperIndex)   //the size of the sublist                       // is 1
      max= myLinkedList.get(lowerIndex);
   else
   {
      max = largest(myLinkedList, lowerIndex + 1, upperIndex);
      if( myLinkedList.get(lowerIndex).length() >      myLinkedList.get(upperIndex).length())
          max= myLinkedList.get(lowerIndex);
      else
          max= myLinkedList.get(upperIndex);
   }
//   System.out.println(max);
     return max;
}

}

4

3 に答える 3

0

行ごとではなく、再帰メソッドlargestは次のようになります。

  1. elseブロックから自分自身を呼び出します。最初の行動は満足しました。
  2. 上部(ifブロック)に終了条件があり、それ自体は呼び出されません。2番目の動作が満たされました。

ブロック内のlargestメソッドの呼び出しの下にロジックを配置した理由がわかりません。elseあなたがそれをよりよく理解することを願っています。

于 2012-10-15T05:18:34.500 に答える
0

私たちの目標は、再帰について演習することです。

Yogendra Singhの回答はより学者的であるため、より感謝しています。

Petro Semeniuk の提案はうまく機能しますが、それは問題ではありません。

LinkedList< T > の AMHO 再利用は適切な選択ではありません。

再帰を理解し、その内部動作に触れるには、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());
   }
}

パフォーマンスに関する注意: new 演算子は main() の外で直接呼び出されません。

于 2012-10-15T05:54:42.820 に答える
0

このプログラムをより読みやすく、全体的に見栄えを良くするために行うことができるいくつかの小さな改善があります。

  • グローバル静的変数の使用を排除します。戻り値として答えを返す必要があるという再帰関数の本当に悪い味とポイント
  • 再帰を正しく行いたい場合は、独自のデータ構造を作成せずに、java.util パッケージのリストを使用してください。

問題の解決策となる可能性のあるいくつかの行をまとめました。アプローチは、リストが空になるまで深くなるたびにリストを減らすことです:

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

あなたが探しているものを私に知らせてください。

于 2012-10-15T05:37:35.127 に答える