我试图在Scheme中编写一个函数,它接受两个字符串作为输入,并返回所有最佳字符串对的列表。为了做到这一点,我知道我需要使用我已经写过的以下功能。已编写的函数显然需要用作我试图编写的函数的辅助函数。
1。得分-字符
此函数接受两个字符串,并根据评分标准对每个字符进行评分并累积结果。如果两个字符相等,则获得2分,如果两个字符不相等,则获得-1分,最后,如果一个字符是下划线,另一个字符是其他字符,则得分为-2得到了。
以下是输入/输出示例:
> (score-chars "x" "x")
2
> (score-chars "x" "y")
-1
> (score-chars "x" "_")
-2
> (score-chars "Cheese" "Computer")
-3
2。改变串-对
此函数将两个字符(a和b,比方说)和一对字符串列表作为输入,并返回修改后的字符串对列表:对于列表中的每个字符串对。
以下是输入/输出示例:
> (change-string-pairs "a" "b" '(("one" "two")("three" "four")("five" "six")))
(("aone" "btwo") ("athree" "bfour") ("afive" "bsix"))
第3。得到最佳-对
此函数同时采用评分函数(在这种情况下为评分函数将为score-chars,如上所述)和作为输入的字符串对列表,然后返回修改后的字符串对列表。返回的列表将包含输入中的所有最佳字符串对,根据输入函数进行评分。
以下是输入/输出示例:
> (get-best-pairs score-chars '(("cheese" "cake")("door" "wall")("bunny" "roof")("mouse" "house")("photo" "video")))
(("mouse" "house"))
我已经编写了上面描述的所有这些功能,我尝试使用这些功能编写的功能将具有以下功能:
输入/输出:
> (get-all-best-pairs "many" "penny")
(("man_y" "penny")
("ma_ny" "penny")
("m_any" "penny")
("_many" "penny"))
如果我能够大致了解如何做到这一点,那真的很棒。另外,在我上面编写的函数中,我使用了一些内置的Scheme函数,如map,filter,append和apply。
我也知道,该算法效率极低,并且具有指数复杂性。我此时并不关心这一点。
我知道第一步是编写一个能够生成所有可能的序列匹配的函数。一旦我有了这个功能,剩下的就很简单了。因此,这是我真正陷入困境的部分。
答案 0 :(得分:1)
我认为除了可以使用谓词函数对列表进行排序的函数之外,您几乎拥有所需的一切。
如果您的Scheme解释器没有提供排序功能,您可以使用Wikibooks找到的排序功能。您必须调整它以采用谓词函数,而不是使用<=
作为默认谓词函数。
您的谓词函数可以是:
(define (compare-by-alignment lhs rhs)
(<= (alignment-score-tail lhs) (alignment-score-tail rhs)))
您可以使用列表和谓词函数调用merge-sort
:
(merge-sort lst compare-by-alignment)