Haskell字符串操作

威廉·琼斯

我正在尝试创建一个结合了给定整数列表的字符串的函数。例如,假设给出了函数[1,2,3],则输出为" ***"基本上,每个数字都代表一个*在其前面带有空格的数字因此,数字5" *"是4个空格,后跟*但是,我得到了一个列表,但不能将++它们全部放在一起,因为字符串会弄乱顺序。

我的想法是从列表中的第一个元素开始,然后将其作为字符串递归发送回去。所以对于[1,2,3]我送回功能[2,3]String = " *"接下来,对于每个元素,我检查字符串-1的长度是否<=是下一个元素(-1,因为其中包括0)。在我提供的功能的列表中,总是这样(列表始终是0到9之间的数字,递增,并且不重复)。然后,我将++原始字符串再次调用该函数以进行递归语句。我这样做了,直到一无所有。这是我所做的:

makeStr :: [Integer] -> String -> String
makeStr [] _ = ""
makeStr (x:xs) s
        | null xs && s == ""               = getStar ((fromIntegral x)) "*"
        | null xs && s /= ""               = s ++ getStar ((fromIntegral x) - (length s)) "*"
        | s == ""                          = makeStr xs (getStar ((fromIntegral x) - ((length s))) "*")
        | length s - 1 <= (fromIntegral x) = s ++ makeStr xs (getStar ((fromIntegral x) - ((length s))) "*")

注意:getStar是一个简单的函数,它接受数字和“ *”并返回带有正确空格数量的字符串。它具有的声明getStar :: Int -> String -> String此功能运行完美,我已经对其进行了无数次测试,但我真的不相信这是问题所在,因此为什么不包含它。

getStar函数的示例是:

getStar 3 "*"
"   *"

一些带有预期输出的示例输入:

makeStr [1,2,3] ""
" ***"

makeStr [0,2,3] ""
"*  **"

makeStr [1,2,3,4] ""
" ****"

makeStr [0,9] ""
"*        *"

我的程序的输出对于2个元素以上的任何列表都是错误的。

makeStr [0,1] "" -- correct
"**"

makeStr [1,2,3] "" -- incorrect, should be " ***"
" **  *"

makeStr [1,2,3,4] "" -- incorrect, should be " ****"
" **  * *"

我不知道为什么对前两个元素正确,然后对之后的任何元素都不正确。我已经多次跟踪了它,但似乎一切正常。

编辑解决方案:

makeStr :: [Integer] -> String
makeStr [] = ""
makeStr (x:xs)
            | x == 0 = "*" ++ makeStr (map (subtract 1) xs)
            | x /= 0 = " " ++ makeStr (map (subtract 1) (x:xs))
开支

可能的解决方案可以按照以下步骤操作。

  • 如果输入列表为空,则返回空字符串。
  • 如果输入列表是x:xs,请检查x
    • 如果为x==0,则发出'*',然后递归xs递减每个数字的位置
    • 如果为x/=0,则发出' ',然后递归x:xs递减每个数字的位置

例如

f [1,3]
= ' ' : f [0,2]
= ' ' : '*' : f [1]
= ' ' : '*' : ' ' : f [0]
= ' ' : '*' : ' ' : '*' : f []
= ' ' : '*' : ' ' : '*' : []
= " * *"

上面的效率可能不高。可以通过保留第二个“偏移”整数参数来提高效率,并增加它而不是减少整个列表。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章