【发布时间】:2014-11-05 02:16:33
【问题描述】:
今年我的一个模块是 Haskell 编程。我无法以如此简单的方式表达复杂性,尤其是来自 C# 等其他语言的复杂性。
熟悉过程的一部分涉及我们实现一个 drop' 函数,该函数从列表中删除 n 个元素。
写一个函数 drop' :: Int -> [a] -> [a],其中 drop' n xs 返回的 xs 删除了它的前 n 个元素。
到目前为止,我想出的是这个。
drop' :: Int -> [a] -> [a]
drop' x [] = []
drop' x (y : ys) = if x == 0 then ys else drop' (x-1) ys
我知道我需要在列表的尾部递归调用 drop' 以有效地删除一个元素,但我不知道如何计算已删除的元素数量,以便确保删除 n 个元素。
我知道上面没有给我预期的结果,因为它比我预期的多删除了 1,但有趣的是,这有效:
drop' :: Int -> [a] -> [a]
drop' x [] = []
drop' x (y : ys) = if x == 1 then ys else drop' (x-1) ys
我无法推断出原因!任何有关此逻辑的帮助将不胜感激!
【问题讨论】:
-
从5数到0,会有六个数。因此,在第一种情况下,您要删除 6 个数字,而在第二种情况下,您要删除 5 个(从 5 到 1)。除此之外,我猜第一个错误,
If x == 0 then ys,也许? -
条件确保元素只有在 x 不等于 0 时才会被移除,所以在第一种情况下应该是:5 = 1 移除,4 = 2 移除,3 = 3 移除,2 = 4 删除,1 = 5 删除。但事实并非如此!
标签: haskell