我正在尝试创建一个结合了给定整数列表的字符串的函数。例如,假设给出了函数[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] 删除。
我来说两句