Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 比较两个列表之间的元素-Haskell_List_Haskell_Recursion - Fatal编程技术网

List 比较两个列表之间的元素-Haskell

List 比较两个列表之间的元素-Haskell,list,haskell,recursion,List,Haskell,Recursion,这可能是个愚蠢的问题,但我已经在这个问题上纠缠了好几个小时了。。我做了一个遗传算法,但我想我可以尝试改进一下。我想做一个适应度函数,比较两个数字列表并返回一个值。如果两个列表包含相同的数字且位于相同的“位置”,则函数应返回+2。如果列表包含相同但位置错误的数字,则应返回+1 我已经创建了两个不同的函数,它们都完成了其中一个任务,但我无法将它们合并到一个函数中。以下是功能: samePlace _ [] = 0 samePlace [] _ = 0 samePlace (x:xs) (y:ys)

这可能是个愚蠢的问题,但我已经在这个问题上纠缠了好几个小时了。。我做了一个遗传算法,但我想我可以尝试改进一下。我想做一个适应度函数,比较两个数字列表并返回一个值。如果两个列表包含相同的数字且位于相同的“位置”,则函数应返回+2。如果列表包含相同但位置错误的数字,则应返回+1

我已经创建了两个不同的函数,它们都完成了其中一个任务,但我无法将它们合并到一个函数中。以下是功能:

samePlace _ [] = 0
samePlace [] _ = 0
samePlace (x:xs) (y:ys)
    | x == y = (sP xs ys) + 2
    | otherwise = sP xs (ys)
此函数为每个相同且位置正确的数字返回+2

notSamePlace [] _ = 0
notSamePlace _ [] = 0
notSamePlace (x:xs) (ys)
    | elem x (ys) = (notSamePlace xs ys) + 1
    | otherwise = (notSamePlace xs ys)
如果第一个列表中的数字之一存在于第二个列表中,则此函数返回+1


我遇到的问题是,同一个位置函数需要将两个列表分开,并一次通过一个数字来比较它们,而不相同的位置函数需要保持第二个列表完好无损,而不会将其拆分为头尾两部分。如果有人能为我指出解决这个问题的正确方向,我将不胜感激

此外,我的想法是,该函数可以缩短在遗传算法中找到解决方案所需的时间。如果我的解决方案是找到字符串“hello world”,那么我的想法是,具有“leolh owdrl”基因的个体应该比看起来像“hFz%l r0M/z”的基因更适合。到目前为止,在我的程序中,第一个基因的适应度值为1(因为“空格”是与目标字符位于同一位置的唯一字符),但第二个基因的适应度值为“h”和“空格”,因此它的适应度值为2。这是个好主意还是不好


谢谢

下面的函数使用
zip
索引每个字符,这允许将完整的第二个列表传递到递归调用中

places :: String -> String -> Int
places _ [] = 0
places [] _ = 0
places xs ys = zippedPlaces (zip xs [1..length xs]) (zip ys [1..length ys])

zippedPlaces :: [(Char, Int)] -> [(Char, Int)] -> Int
zippedPlaces [] _ = 0
zippedPlaces (x:xs) ys =
    let match = filter (\(num, i) -> fst x == num) ys
    in case match of
        [] -> zippedPlaces xs ys
        (a:_) -> (if snd a == snd x then 2 else 1) + zippedPlaces xs ys

假设列表中不包含重复项:

place [] _ = 0
place _ [] = 0
place (x:xs) (y:ys) = place xs ys +
  if x == y then 1 else (if elem x ys then 2 else 0) + (if elem y xs then 2 else 0)

提示:编写一个函数,它接受两个列表
(as,bs)
,并返回
(c,as',bs')
其中
c
是与“和
bs”处于相同位置的字母数,
与“
bs”是
as
bs
,删除了这些常用字母。如果您需要编辑距离作为您的适应功能,请参阅文件包(披露:我是作者).你能理解为什么这里的
notSamePlace
函数对于长字符串来说会非常慢吗?你能想出一种使用辅助数据结构来帮助的方法吗?提示:您可以在包中找到两个合理的选项。其中一个比较明显适用;另一个实际上更快。“同一个位置函数需要拆分两个列表[…],而不相同的位置函数需要保持第二个列表的完整性,而不将其拆分为首尾。”提示:您可以使用as模式,例如
list@(x:xs)
其中
list
将提供整个列表,
x
头部和
xs
尾部谢谢你的回答!甚至没有考虑到你可以使用zip函数…有时候,你只是需要一个新的视角来解决问题。再次感谢!:)<代码>*主数据。地图数据。列表>放置“Hello”“Hell”7
看起来并不聪明