1

特定の文字列「Sluggo」に対して次の処理を行う再帰メソッドを使用してプログラムを作成しようとしています。

Please enter a string: Sluggo
Sluggo
Slugg
Slug
Slu
Sl
S
luggo
lugg
lug
lu
l
uggo
ugg
ug
u
ggo
gg
g
go
g
o

これはこれまでの私のプログラムです:

 import java.util.Scanner;

 public class RecursiveDescentParser {


 public static void main(String[] args) 
 {
   Scanner input = new Scanner(System.in);

   System.out.println("Please enter a string: ");
   String s = input.next();

   chopBack(s.substring(0));
   chopBack(s.substring(1));
   chopBack(s.substring(2));
   chopBack(s.substring(3));
   chopBack(s.substring(4));
   chopBack(s.substring(5));
 }//end of main

 public static String chopBack(String str)
 {
   if (str.length() == 0)
      return "";
   else
      System.out.println(str.substring(0, str.length()));
      return chopBack(str.substring(0, str.length() - 1 ));
 }
}

二重再帰メソッドに似たものを書く必要があるので、それが正しくないことはわかっています。この時点からどこに行けばいいのか疑問に思っていますか?文字列の先頭から char を削除するメソッドも作成しました。この時点で、この 2 つを接続する方法がよくわかりません (笑)。

4

3 に答える 3

1

ありがとうございます!

友人とこれを少しいじっただけで、彼がc#で思いついた解決策は次のとおりです

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            while (true)
            {
                Console.Write("Enter a string:");
                string input = Console.ReadLine();

                //input = "Sluggo";
                initialLength = input.Length;
                recursiveFunctionYAY(input);
            }
        }

        static int initialLength;

        static void recursiveFunctionYAY(string input)
        {
            if (input.Length == 0)
                return;

            Console.WriteLine(input);
            recursiveFunctionYAY(input.Substring(0, input.Length - 1));

            if (input.Length == initialLength)
            {
                initialLength = initialLength - 1;
                recursiveFunctionYAY(input.Substring(1, input.Length - 1));
            }
        }
    }
}
于 2013-11-14T20:21:48.923 に答える
0

ここにあります:

public String run(String input) {

    StringBuilder sb = new StringBuilder();

    process(input, sb);

    return sb.toString();
}

private void process(String input, StringBuilder sb) {

    tail(input, sb);

    if (input.isEmpty()) {
        sb.deleteCharAt(sb.length() - 1);
        return;
    }

    process(input.substring(1, input.length()), sb);
}

private void tail(String input, StringBuilder sb) {

    if (input.isEmpty())
        return;

    sb.append(input).append('\n');

    tail(input.substring(0, input.length() - 1), sb);
}
于 2013-11-14T08:25:27.903 に答える
0

java.util.Scanner をインポートします。

/** * @author JFVARUGH * */ public class RecursiveStringRem {

static String str ;
public static void main(String[] args) {
    // TODO Auto-generated method stub
    RecursiveStringRem drive = new RecursiveStringRem();
    Scanner sc = new Scanner(System.in);
    System.out.println("Input the String");
    str = sc.nextLine();
    drive.superStringCall(str);
}

public void  truncateSingleString(String str){
    // Base Condition
    if(str.length()==1){
        System.out.println(str);
        return;
    }

    // Recursive Call 
    System.out.println(str);
    // This will truncate the string by one position
    truncateSingleString(str.substring(1));         
}

public void superStringCall(String str){

    //Base Condition
    if(str.length()==1){
        return;
    }

    // Recursive Call 
    System.out.println(str);
    // This will call the previous function
    truncateSingleString(str.substring(1));

    // Recursive call in the current function
    superStringCall(str.substring(1));      
}

}

コメントは自明だと思います。

これは準拠したコードです。

于 2013-11-14T09:45:07.550 に答える