2011-04-01 29 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