我正在尝试编写一个函数,该函数给出一个数字列表,返回一个列表,其中从最后一个元素开始,每个第二个数字的值都加倍。因此,如果列表元素是 1..n,则第 n 将保持原样,第 (n-1)-th 的值将翻倍,第 (n-2)-将保持原样原样等
所以这是我解决它的方法:
MyFunc :: [Integer] -> [Integer]
MyFunc xs = reverse (MyFuncHelper (reverse xs))
MyFuncHelper :: [Integer] -> [Integer]
MyFuncHelper [] = []
MyFuncHelper (x:[]) = [x]
MyFuncHelper (x:y:zs) = [x,y*2] ++ MyFuncHelper zs
它有效:
MyFunc [1,1,1,1] = [2,1,2,1]
MyFunc [1,1,1] = [1,2,1]
但是,我不禁想到必须有一个比反转列表、处理它然后再次反转它更简单的解决方案。我可以简单地向后迭代列表吗?如果是,如何?
最佳答案
under reversed f xs
来自 lens
的成语库将以相反的顺序将 f 应用于 xs:
under reversed (take 5) [1..100] => [96,97,98,99,100]
关于list - Haskell - 如何以优雅的方式以相反的顺序迭代列表元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20459241/