【问题标题】:Turing Machine Algorithm图灵机算法
【发布时间】:2021-07-23 04:56:00
【问题描述】:

你能帮帮我吗?我需要为使用以下两个字母 a 和 b 的单磁带图灵机编写代码。
所以程序应该显示两个词的共同前缀。
例如:
g(aab,aaaba) -> aa; g(_,abab) -> _; g(aaba,baa) -> _; g(_,_) -> _; g(babaab,babb) -> bab
其中 g 是机器的功能,下划线表示一个空单词,单词之间有空格
我尝试实现以下选项:
如果在开头我们看到字母 a,那么我们将其删除并移至第二个单词的开头。如果我们还在那里看到一个字母 a,我们也会将其删除,并在两个单词之后通过空格写 a。之后我们回到第一个单词的开头并重复这个操作。当第一个单词的第一个字母和第二个单词的第一个字母不再匹配时,我们会删除剩下的所有内容。 但是我在代码上遇到了一些麻烦,因为每次操作后两个单词之间的空格会变长,我不知道如何控制它。当第一个或第二个单词完全是公共前缀时也会出现问题,例如:
g(baa,baabab) -> baa

【问题讨论】:

    标签: algorithm turing-machines


    【解决方案1】:

    您的方法似乎是合理的。从您的描述看来,您只是难以概括某些单独的步骤。

    例如,要处理两个单词之间不断增长的空格,请记住,在程序中的任何时候,两个单词都被一个或多个空格分隔。因此,针对一般情况实施您的查找操作。

    对于常见的前缀情况,您必须处理最终用完字符来比较的情况。所以从第一个单词中删除字符后,在寻找第二个单词的开头时,检查你传递的第一个字符是字母还是空格。如果它是一个空格,那么你在前缀的情况下,需要注意你以后不要试图回到第一个单词,因为你已经删除了所有的单词,只剩下空格了。同样,如果第二个词是前缀,你可以在寻找输出时检测到这一点。

    尝试将算法分解为其基本步骤,并单独测试每个步骤。当您可以孤立地专注于一个简单的步骤时,确保正确处理极端情况会容易得多,而不必将其作为更大算法的一部分进行测试。这样做是调试代码的一项基本技能,因此认为这是一个很好的练习。即使一开始看起来很痛苦,也要确保你有一种结构化的方法来分析问题并将代码分解成更小的部分,最终你将能够解决任何问题。编码愉快!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-27
      • 2018-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多