Haskell正负交替序列函数实现求助:intercalarNum编写问题
Haskell交替正负序列函数实现问题解析
你的代码主要有这几个问题:
- 类型不匹配:
intercalarNum递归调用返回的是列表,但你把这个列表传给了只接受单个数字的intercalarnumAux,类型完全对不上,这是GHCI报错的主要原因。 - 辅助函数逻辑没用对:
intercalarnumAux不管输入正负都返回-x,既实现不了交替符号的需求,也没用到正确的场景里。 - 递归思路错了:你现在的递归没传递“下一个元素该用正还是负”的状态,反而试图处理整个递归结果,方向偏了。
下面给你两种简单的正确实现:
方式一:递归切换符号
intercalarNum :: (Num a, Integral a) => a -> a -> [a] intercalarNum 0 _ = [] intercalarNum n y = y : intercalarNum (n-1) (-y)
每次递归的时候把第二个参数取反,下一个元素就会是相反的符号,递归n次就生成了长度为n的交替序列。这里把Ord a换成Integral a是因为序列长度得是整数,用浮点数的话递归还会有精度问题。
方式二:用标准库简化
如果想偷懒,直接用cycle生成无限交替序列再截取前n个:
intercalarNum :: (Num a, Integral a) => a -> a -> [a] intercalarNum n y = take (fromIntegral n) $ cycle [y, -y]
cycle [y, -y]会生成[y,-y,y,-y,...]的无限序列,take截取前n个就完事了,代码更简洁。
试一下intercalarNum 5 2,两种写法都会返回[2,-2,2,-2,2],完全符合你的要求。
内容的提问来源于stack exchange,提问作者Birdy
相关产品推荐
相关产品推荐

