2009-12-09 36 views
1

我正在處理一部分代碼,它本質上是試圖將遞歸的字符串列表簡化爲單個字符串。遞歸困境 - 減少輸入字符串

我有一個內部數據庫建立了不同長度的匹配字符串數組(比如說數組長度爲2-4)。

一個例子輸入字符串數組是:

{"The", "dog", "ran", "away"} 

,併爲進一步例如,我的數據庫可以由字符串數組以這種方式:

(length 2) {{"The", "dog"},{"dog", "ran"}, {"ran", "away"}} 
(length 3) {{"The", "dog", "ran"}.... and so on 

那麼,什麼我試圖要做的是遞歸地將我的輸入字符串數組縮減爲單個標記。所以理想情況下,它會解析這樣的事情:

1) {"The", "dog", "ran", "away"} 

Say that (seq1) = {"The", "dog"} and (seq2) = {"ran", "away"} 

2) { (seq1), "ran", "away"} 
3) { (seq1), (seq2)} 

In my sequence database I know that, for instance, seq3 = {(seq1), (seq2)} 

4) { (seq3) } 

因此,當它歸結爲一個單一的標記,我很高興,功能將結束。

這裏是我當前的程序邏輯的輪廓:

public void Tokenize(Arraylist<T> string_array, int current_size) 
{ 
    // retrieve all known sequences of length [current_size] (from global list array) 
    loc_sequences_by_length = sequences_by_length[current_size-min_size]; // sequences of length 2 are stored in position 0 and so on 

    // escape cases 
    if (string_array.Count == 1) 
    { 
    // finished successfully 
    return; 
    } 
    else if (string_array.Count < current_size) 
    { 
    // checking sequences of greater length than input string, bail 
    return; 
    } 
    else 
    { 
    // split input string into chunks of size [current_size] and compare to local database 
    // of known sequences 
    // (splitting code works fine) 

    foreach (comparison) 
    { 
     if (match_found) 
     { 
     // update input string and recall function to find other matches 
     string_array[found_array_position] = new_sequence; 
     string_array.Removerange[found_array_position+1, new_sequence.Length-1]; 
     Tokenize(string_array, current_size) 
     } 
    } 
    } 

    // ran through unsuccessfully, increment length and try again for new sequence group 
    current_size++; 
    if (current_size > MAX_SIZE) 
    return; 
    else 
    Tokenize(string_array, current_size); 
} 

我認爲這是足夠簡單,但已經得到了一些奇怪的結果。 一般來說,它似乎工作,但進一步審查我的輸出數據時,我看到一些問題。主要是,它似乎工作到某個點......在那個時候,我的'curr_size'計數器重置爲最小值。

所以它被稱爲2的大小,然後3,然後4,然後重置爲2. 我的假設是,它會運行到我的預定最大大小,然後完全保釋。

我試圖儘可能簡化我的代碼,所以在轉錄時可能會有一些簡單的語法錯誤。如果有任何其他細節可以幫助鷹眼SO用戶,請讓我知道,我會編輯。

在此先感謝

+0

是不是第3步('{{ 「的」, 「狗」},{ 「跑」, 「離開」}}')已經只有一組? – 2009-12-09 00:14:27

+0

我會編輯以更好地反映發生了什麼 – espais 2009-12-09 00:18:47

+0

您的意思是4){{{「The」},{「dog」}},{{「ran」},{「away」}}}? – 2009-12-09 00:20:26

回答

0

不知道所有的問題是什麼,但我要做的第一件事就是在方法開始的時候讓你的「全部」退出塊。

public void Tokenize(Arraylist<T> string_array, int current_size) 
{ 
    if (current_size > MAX_SIZE) 
    return; 

    // Guts go here 

    Tokenize(string_array, ++current_size); 
} 

有兩件事情:

  1. 您的令牌不明確從您輸入的字符串值分開。這使得處理更加困難,並且看到發生了什麼。
  2. 它看起來像你寫的僞代碼:不使用
    • loc_sequences_by_length
    • found_array_position沒有定義
    • Arraylist應該是ArrayList

總的來說,我同意詹姆斯的說法:

,如果你清理 代碼這將幫助,以使其更易於閱讀。

-Doug

+0

贏家,因爲您幫助我重新思考我的方法......感謝您的意見! – espais 2009-12-15 21:52:41

+0

沒問題 - 我很高興它有幫助! :) – Doug 2009-12-22 16:46:34

1

一個錯誤是: string_array[found_array_position] = new_sequence;

我不知道這個定義,而據我所知,如果它被定義,它永遠不會改變。

在你的if語句中,如果match_found曾經設置爲true?

而且,看來你在這裏有一個額外的右括號,但您可能需要的代碼的最後一塊是功能之外:

 } 
    } 
    } 

如果您清理代碼它會幫忙,使它更易於閱讀。一旦我們經歷了句法錯誤,我想就會更容易看出發生了什麼。