C# 递归灾难-减少输入字符串

C# 递归灾难-减少输入字符串,c#,recursion,tokenize,C#,Recursion,Tokenize,我正在编写一部分代码,基本上是试图将字符串列表递归地减少为单个字符串 我有一个内部数据库,由不同长度的匹配字符串数组组成(比如数组长度为2-4) 输入字符串数组示例如下: {"The", "dog", "ran", "away"} 再举一个例子,我的数据库可以用以下方式由字符串数组组成: (length 2) {{"The", "dog"},{"dog", "ran"}, {"ran", "away"}} (length 3) {{"The", "dog", "ran"}.... and so

我正在编写一部分代码,基本上是试图将字符串列表递归地减少为单个字符串

我有一个内部数据库,由不同长度的匹配字符串数组组成(比如数组长度为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);
}
public void标记化(Arraylist string\u数组,int current\u size)
{
//检索长度[当前大小]的所有已知序列(从全局列表数组)
loc_sequences_by_length=sequences_by_length[current_size-min_size];//长度为2的序列存储在位置0,依此类推
//逃逸案件
if(string_array.Count==1)
{
//顺利完成
返回;
}
else if(string\u array.Count<当前大小)
{
//检查长度大于输入字符串的序列,bail
返回;
}
其他的
{
//将输入字符串拆分为大小为[当前大小]的块,并与本地数据库进行比较
//已知序列的排序
//(拆分代码可以正常工作)
foreach(比较)
{
如果(找到匹配项)
{
//更新输入字符串和回调函数以查找其他匹配项
字符串\u数组[找到的\u数组\u位置]=新的\u序列;
string_array.Removerange[找到_array_位置+1,新的_序列.Length-1];
标记化(字符串数组、当前大小)
}
}   
}
//未成功运行,请增加长度并重试新序列组
当前_大小++;
如果(当前大小>最大大小)
返回;
其他的
标记化(字符串数组、当前大小);
}
我认为这很简单,但得到了一些奇怪的结果。 一般来说,它似乎是有效的,但在进一步检查我的输出数据后,我发现了一些问题。主要是,它似乎工作到某一点……在这一点上,我的“curr_size”计数器重置为最小值

因此,它的大小是2,然后是3,然后是4,然后重置为2。 我的假设是,它将运行到我预定的最大尺寸,然后完全退出

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

提前感谢

一个错误是:
string\u数组[找到的\u数组\u位置]=新的\u序列

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

在if语句中,当if
match\u找到时
是否设置为true

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

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

一个错误是:
string\u数组[找到的\u数组\u位置]=新的\u序列

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

在if语句中,当if
match\u找到时
是否设置为true

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

     }
    }   
  }

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

不确定所有的问题是什么,但我要做的第一件事是在方法的开始处设置“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);
}
public void标记化(Arraylist string\u数组,int current\u size)
{
如果(当前大小>最大大小)
返回;
//胆量到这里来
标记化(字符串数组+当前大小);
}
有几件事:

  • 您的令牌与输入字符串值之间没有明确的分隔。这使得处理和查看发生了什么变得更加困难
  • 看起来您正在编写伪代码:
    • 不使用按长度排列的loc_序列
    • 未定义找到的\u数组\u位置
    • Arraylist
      应该是
      Arraylist
    • 等等
  • 总的来说,我同意詹姆斯的说法:

    如果你把房间打扫干净会有帮助的 代码,使其更易于阅读


    -Doug不确定所有的问题是什么,但我要做的第一件事是在方法的开头设置“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);
    }
    
    public void标记化(Arraylist string\u数组,int current\u size)
    {
    如果(当前大小>最大大小)
    返回;
    //胆量到这里来
    标记化(字符串数组+当前大小);
    }
    
    有几件事:

  • 您的令牌与输入字符串值之间没有明确的分隔。这使得处理和查看发生了什么变得更加困难
  • 看起来您正在编写伪代码:
    • 不使用按长度排列的loc_序列
    • 未定义找到的\u数组\u位置
    • Arraylist
      应该是
      Arraylist
    • 等等
  • 总的来说,我同意詹姆斯的说法:

    如果你把房间打扫干净会有帮助的 代码,使其更易于阅读


    -Doug

    第三步(
    {{“The”,“dog”},{“rand”,“away”}}
    )不是只有一个组吗?我会编辑以更好地反映p.s.的情况。所有这些下划线灼伤了我的眼睛,我能感觉到我的手在疼痛,就在想到要到达终点的时候。请用骆驼套管换个名字。我认为我自己很聪明,但是我在你的问题周围缠着我简单的大脑。另一件我不明白的是为什么这个ALG。