2011-04-01 38 views
32

我目前正在通过一些递归问题的方式工作,我目前停留在一个。只是在Java中的一个小递归问题

的问题是递归插入空格成一个字符串,为每一个可能的位置,从而使输出看起来是这样的:

Input: ABCD 
Out: 
     ABCD 
     A BCD 
     A B CD 
     A B C D 
     A BC D 
     AB CD 
     AB C D 
     ABC D 

我已经目前对这个问题的工作,并得到了一点多像:

Input: ABCD 
Out: 
     ABCD 
     A BCD 
     A B CD 
     A B C D 

我对这个问题到目前为止的代码:

import java.util.Scanner; 

public class Words 
{ 
    static int counter = 0; 
    static String fString = ""; 
    static String fString2 = ""; 
    static String previous = ""; 
    static String input = ""; 
    static String other = ""; 

    public static String segment(String inputPrefix, String restOfString) 
{ 
    if(restOfString.length() != 0) 
    { 
     if(inputPrefix.equals("")) 
     { 
      fString += restOfString + "\n"; 
      segment(restOfString.substring(0,1), restOfString.substring(1)); 
     } 
     else 
     { 
      previous += inputPrefix + " "; 
      fString += previous + restOfString + "\n"; 
      fString2 = previous + restOfString; 
      segment(restOfString.substring(0,1) 
          , restOfString.substring(1)); 
     } 
    } 
    /*else 
    { 
     counter++; 
     other = fString2.replaceAll(" ", ""); 
     System.out.println(other); 
     if((counter + 1) < other.length()) 
     { 
      System.out.println("Other: " + other); 
      input = other.substring(0, counter + 1); 
      other = other.substring(counter + 1); 
      System.out.println(counter); 
      System.out.println("input: " + input); 
      System.out.print("other: " + other); 

      segment(input, other); 
     } 
     else 
      return fString; 
    }*/ 

    return fString; 

} 

public static void main (String[] args) 
{ 
    Scanner scan = new Scanner(System.in); 
    System.out.print("Enter a string: "); 
    String input = scan.next(); 
    System.out.println(); 
    System.out.println(segment("", input)); 

} 
} 

第二个else子句是我遇到最大麻烦的地方,因为每次我运行un-comment时,它都会进入无限循环。我甚至把int跟踪语句(println语句),它仍然没有帮助。

我已经读了很多遍,它对我来说没有意义,为什么它不起作用。

+12

+1作业问题的一个很好的例子。显示代码到目前为止,确切地说问题的哪一部分是问题。 – 2011-04-01 15:54:34

+2

当我需要递归解决方案时,它可以帮助我思考“程序必须做什么”,而不是“程序如何做”。 – 2011-04-01 15:54:39

+0

+1一直在寻找一个体面的程序化脑锻炼! – mre 2011-04-01 16:03:11

回答

2

看起来您已经能够正确进行第一个“分组”,但无法获得下一个分组。

分组为:'A BCD','AB CD'和'ABC D'。你需要将你的算法应用到这些分组中的每一个。你已经将它应用到第一个。你如何得到其余的人?

有足够的时间过去了吗?我写了一个python解决方案来看看它与Java相比的样子。

def segment(input, separator=' ', start_from=0): 
    print input 
    # add spaces after each letter starting from start_from index, terminating at last letter-1 
    for i in range(start_from, len(input)-1): 
     # if the next letter is already a space, or this letter is a space, move on 
     if separator in (input[i+1], input[i]): continue 
     # whatever index we're on, do the next one recursively 
     segment(input[:i] + input[i] + separator + input[i+1:], separator=separator, start_from=i+1) 

segment('ABCD') 
+0

如果我想要放置多于?一个空间,例如,如果我得到ABCD我可以把一个BCD(2位) – Dejell 2013-11-27 19:40:14

+0

@Dejel注意到'separator'说法只是要两个空格代替一个,即:'段(“ABCD”,分隔符=”' )' – 2013-11-27 23:46:40

+0

我的意思是玩弄 - 一次放置一个空格,另一次放置分隔符作为2个空格 – Dejell 2013-11-28 12:49:03

4

让我对代码怀疑的第一件事是,你应该返回一系列字符串,但是你的返回值是一个字符串。

也许,你应该确定你的基本情况和递归步骤。

看起来你已经有了基础案例的开始。您可以在空字符串插入零个空间,所以

allPossibleSpacings("") -> [ "" ] 

,但你不希望在结尾处一个空间,所以你需要一个第二基本情况

allPossibleSpacings("x") -> [ "x" ] 

,然后你的递归一步可能是

allPossibleSpacings("x" + s) -> flatten(
    ∀ t : allPossibleSpacings(s), ["x" + t, "x " + t]) 

我不会帮你写在Java中,因为它的功课,但希望有所帮助。

+0

我不知道没有使用像TeX这样的东西存在的∀符号...真棒! – 2011-04-01 16:43:35

+3

@Michael McGowan,unicode page 22xx有各种方便的数学符号。 http://unicode.org/charts/PDF/U2200.pdf – 2011-04-01 16:48:56

3
void recurse(String myString, int start){ 
     System.out.println(myString); 
     for(int i = start; i < myString.length; i++) { 
      if (myString.charAt(i) != ' '){ 
       recurse(myString.Substring(0,i) + ' ' + myString.Substring(i), i+2); 
      } 
     } 
    } 

先用流水调用(“ABCD”,1);

+0

-0.5作业的重点在于学会思考问题,而不是为你提供答案。 – 2011-04-01 16:24:35

+2

我只是想解决这样的事情:( – 2011-04-01 18:35:38

+0

@让BernardPellerin如果我需要做不同的事情,我得到的字符串的长度未知,需要插入空格高达字符串的长度为6例如是如果我ABCD我可以插入A BCD(在A之后2个空格)或A BCD(A之后1个空格) – Dejell 2013-11-27 20:15:40