【发布时间】:2019-02-20 15:08:55
【问题描述】:
我需要一个函数将列表中的每个其他数字加倍。这就是诀窍:
doubleEveryOther :: [Integer] -> [Integer]
doubleEveryOther [] = []
doubleEveryOther (x:[]) = [x]
doubleEveryOther (x:(y:zs)) = x : 2 * y : doubleEveryOther zs
但是,问题是我需要从 从右边开始每隔一个数字加倍 - 所以如果列表的长度是偶数,第一个将加倍,等等。
我知道在 Haskell 中反向操作列表很棘手,所以我的计划是反转列表,应用我的函数,然后再次输出反向。我有一个reverseList 函数:
reverseList :: [Integer] -> [Integer]
reverseList [] = []
reverseList xs = last xs : reverseList (init xs)
但我不太确定如何将它植入我的原始函数中。我遇到了这样的事情:
doubleEveryOther :: [Integer] -> [Integer]
doubleEveryOther [] = []
doubleEveryOther (x:[]) = [x]
doubleEveryOther (x:(y:zs)) =
| rev_list = reverseList (x:(y:zs))
| rev_list = [2 * x, y] ++ doubleEveryOther zs
我不太确定包含此类中间值的函数的语法。
如果相关,这是CIS 194 HW 1 中的练习 2。
【问题讨论】:
-
提示:保留旧的
doubleEveryOther,写一个新的函数,新的名字结合reverseList和doubleEveryOther。
标签: haskell