2009-12-09 3 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 (''{{는 "", "개"가}, {} "멀리", "실행"})이 이미 하나 개의 그룹 단계 아닌가요? –

+0

진행 상황을 더 잘 반영하도록 편집하겠습니다. – espais

+0

4) {{{ "The"}, { "dog"}}, {{ "ran"}, { "away"}}}을 의미 했습니까? –

답변

0

모든 문제가 무엇인지 모르겠지만 가장 먼저해야 할 일은 사용자의 메서드 시작시 "catch-all"exit 블록을 사용하는 것입니다.

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
    • 을 정의되어 있지 않습니다.

전반적으로 나는 제임스의 진술에 동의 :

당신이 코드를 정리한다면 도움이 될이 읽기 쉽게 만들 수 있습니다.

더그

+0

우승자는 내 접근 방식을 다시 생각하게 도와 주었기 때문에 ... 의견을 보내 주셔서 감사합니다! – espais

+0

문제 없음 - 어떻게 든 도움이 되었기 때문에 기쁩니다! :) – Doug

1

한 버그가 사전에

감사 : 이 정의되며, 지금까지가 정의 된 경우 내가 말할 수있는, 그것은 변경되지 않습니다 string_array[found_array_position] = new_sequence;

모르겠어요.

if 문에서 match_found이 true로 설정되면? 에 코드를 정리하면

 } 
    } 
    } 

그것은 도움이 될 것이다 :

또한, 여기에 추가 닫기 중괄호가 나타납니다,하지만 당신은 외부 함수로 코드의 마지막 블록을 할 수 있습니다 읽을 수있게 해줍니다. 구문 오류를 지나치게되면 어떤 일이 일어나는지 더 쉽게 알 수 있습니다.