Functional programming 使用辅助函数编写函数

Functional programming 使用辅助函数编写函数,functional-programming,Functional Programming,我正在尝试在Scheme中编写一个函数,它将两个字符串作为输入,并返回所有最佳字符串对的列表。为此,我知道我需要使用我已经编写的以下函数。已经编写的函数显然需要用作我正在尝试编写的函数的帮助函数 1。得分字符 此函数接受两个字符串,并根据评分标准对每个字符进行评分并累加结果。如果两个字符相等,则得分为2;如果两个字符不相等,则得分为-1;最后,如果一个字符是下划线,而另一个字符是其他字符,则得分为-2 以下是输入/输出示例: > (score-chars "x" "x") 2 >

我正在尝试在Scheme中编写一个函数,它将两个字符串作为输入,并返回所有最佳字符串对的列表。为此,我知道我需要使用我已经编写的以下函数。已经编写的函数显然需要用作我正在尝试编写的函数的帮助函数

1。得分字符

此函数接受两个字符串,并根据评分标准对每个字符进行评分并累加结果。如果两个字符相等,则得分为2;如果两个字符不相等,则得分为-1;最后,如果一个字符是下划线,而另一个字符是其他字符,则得分为-2

以下是输入/输出示例:

> (score-chars "x" "x")
2

> (score-chars "x" "y")
-1

> (score-chars "x" "_")
-2

> (score-chars "Cheese" "Computer")
-3  
> (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")) 
2。更改字符串对

此函数接受两个字符(比如a和b)和一组字符串作为输入,并返回一组经过修改的字符串:对于列表中的每个字符串对

以下是输入/输出示例:

> (change-string-pairs "a" "b" '(("one" "two")("three" "four")("five" "six")))
(("aone" "btwo") ("athree" "bfour") ("afive" "bsix"))
3。获得最佳配对

此函数将评分函数(本例中的评分函数将是评分字符,如上所述)和字符串对列表作为输入,然后返回修改后的字符串对列表。返回的列表将包含来自输入的所有最佳字符串对,根据输入函数进行评分

以下是输入/输出示例:

> (score-chars "x" "x")
2

> (score-chars "x" "y")
-1

> (score-chars "x" "_")
-2

> (score-chars "Cheese" "Computer")
-3  
> (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")) 
我已经编写了上面描述的所有这些函数,我试图使用这些函数编写的函数将具有以下内容:

输入/输出:

> (score-chars "x" "x")
2

> (score-chars "x" "y")
-1

> (score-chars "x" "_")
-2

> (score-chars "Cheese" "Computer")
-3  
> (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

我也知道,该算法效率极低,并且具有指数复杂性。我现在不关心这个问题


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

我认为除了一个可以使用谓词函数对列表排序的函数之外,您几乎拥有了所需的一切


如果您的方案解释器不提供排序功能,您可以使用在中找到的功能。您必须对其进行调整,以采用谓词函数,而不是在R5RS和R7RS中使用
,您可以通过R6RS和R6RS对其进行
排序。@R Sahu我不明白的是,为什么我需要在算法解决方案中对列表进行排序,因为我要做的只是采用两个字符串,通过在适当的位置插入下划线来查找所有可能的序列匹配。然后,使用评分标准对创建的每个字符串对进行评分。对创建的所有对进行评分后,找到最大分数,然后过滤掉所有不等于最大分数的字符串对。通过这样做,我将拥有所有的最佳字符串对。@R Sahu那么,我到底需要在哪里使用列表排序,因为我看不出它如何帮助我生成解决方案。@好奇,在找到所有可能的序列匹配(我认为是列表)后,您可以使用评分标准对列表进行排序。然后从排序列表中抓取第一项。@RSahu哦,好的,我明白了。在获得所有可能的序列匹配之后这样做是有意义的,但困难的部分是找到所有可能的。一旦我得到了所有可能的序列匹配,剩下的就很容易了。我不确定的是如何编写一个函数来生成所有可能的序列匹配,并以((“一”“二”)(“三”“四”)等格式返回一个包含所有可能序列匹配的列表。