代码之家  ›  专栏  ›  技术社区  ›  erik

递归问题-减少输入字符串

  •  1
  • erik  · 技术社区  · 16 年前

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

    我有一个内部数据库,由长度不同的匹配字符串数组组成(比如数组长度为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);
    }
    

    我觉得这很简单,但得到了一些奇怪的结果。 一般来说,这似乎是可行的,但在进一步审查我的输出数据后,我发现了一些问题。主要是,它似乎工作到某一点……在这一点上,我的“货币大小”计数器重置为最小值。

    所以它的大小是2,3,4,然后重置为2。 我的假设是,它将达到我预定的最大尺寸,然后完全保释。

    我尽量简化我的代码,所以在转码时可能会有一些简单的语法错误。如果有任何其他细节可以帮助鹰眼用户,请让我知道,我会编辑。

    提前谢谢

    2 回复  |  直到 16 年前
        1
  •  0
  •   Doug    16 年前

    不确定所有的问题是什么,但我要做的第一件事是在方法的开头设置“catch all”出口块。

    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未使用
      • 未定义找到的\数组\位置
      • Arraylist 应该是 ArrayList .
      • 等。

    总的来说,我同意詹姆斯的说法:

    如果你把 代码,以便于阅读。

    -道格

        2
  •  1
  •   James Black    16 年前

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

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

    在你的if语句中, match_found 是否设置为真?

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

         }
        }   
      }
    

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