递归困境 - 减少输入字符串

时间:2009-12-09 00:12:44

标签: c# recursion tokenize

我正在研究一部分代码,它本质上是试图将一个字符串列表递减到一个字符串。

我有一个由不同长度的匹配字符串数组构成的内部数据库(比如数组长度为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用户,请告诉我,我会进行编辑。

提前致谢

2 个答案:

答案 0 :(得分:1)

一个错误是: string_array[found_array_position] = new_sequence;

我不知道这是在哪里定义的,据我所知,如果它被定义,它永远不会改变。

在if语句中,if match_found是否设置为true?

此外,您似乎在这里有一个额外的括号,但您可能希望最后一段代码在函数之外:

     }
    }   
  }

如果您清理代码,使其更易于阅读,将会有所帮助。一旦我们克服了语法错误,我就会更容易看到发生了什么。

答案 1 :(得分: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
  3. 总的来说,我同意詹姆斯的陈述:

      

    如果你清理了它会有所帮助   代码,使其更容易阅读。

    -Doug