当我输入gggiiss作为输入时,输出应为ggg。
round :: String -> String
round []=[]
round [x]=[x]
round (x:xs) = if xs == x then [x] ++ xs + round(xs)
else [x]
上面的代码是我写的,但是我有很多我不理解的错误。有人知道如何纠正吗?鉴于代码的第一行是强制性的
答案 0 :(得分:4)
round :: String -> String
您说您的函数将字符串作为输入并产生一个字符串作为输出。这很好,并且与您的round "gggiiss" == "ggg"
示例一致。
round [] = []
您的基本情况是一个空列表输入,是一个空列表输出,听起来不错。
round [x] = [x]
单个元素的另一个基本情况。所以我想这意味着下一种情况将需要两个或多个元素,对吗? ...
round (x:xs) = ...
哦,不,这是怎么回事?您只需要一个元素(xs
可以是[]
)。您可能想要两个元素,列表round (x1:x2:xs) ...
的其余部分。
if xs == x
那没有道理。您无法将列表xs(例如"ggiiss"
)与单个值x(例如'g'
)进行比较。如果您使用了我上面显示的x1
和x2
,那么x1 == x2
就很有意义,因为它们都是字符。
then [x] ++ xs + round(xs)
同时添加两个字符串xs + round xs
是什么意思?一个更明智的策略可能是串联then [x1] ++ round (x2:xs)
。我保留了x2
,因此在递归的情况下,您需要比较正确的字符。
else [x]
这可能是复制/粘贴问题,但是应该else
缩进then
。最终的代码是:
rnd :: String -> String
rnd []=[]
rnd [x]=[x]
rnd (x1:x2:xs) = if x1 == x2 then [x1] ++ rnd(x2:xs) else [x1]
P.S。出于多种原因,您正在投票。我正在猜测,但是其中最主要的是您没有发布完整的“代码在这里”,“这是我的意图”,“这是我在调用代码的方式”和“错误在这里”的完整内容。 ”。 SO非常明确地要求用户使用代码发布错误和期望,并且在这种情况下用户变得不安。