gpt4 book ai didi

Haskell 字符串操作

转载 作者:行者123 更新时间:2023-12-04 23:36:02 25 4
gpt4 key购买 nike

我正在尝试创建一个函数,该函数在给定整数列表的情况下组合字符串。例如,假设函数被赋予 [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 []
= ' ' : '*' : ' ' : '*' : []
= " * *"

上面的方法并没有达到预期的效率。保留第二个“偏移量”整数参数并递增它而不是递减整个列表可以提高效率。

关于Haskell 字符串操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55546912/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com