使用辅助函数编写函数

时间:2014-04-18 12:29:48

标签: functional-programming

我试图在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。

我也知道,该算法效率极低,并且具有指数复杂性。我此时并不关心这一点。

我知道第一步是编写一个能够生成所有可能的序列匹配的函数。一旦我有了这个功能,剩下的就很简单了。因此,这是我真正陷入困境的部分。

1 个答案:

答案 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)