Одним из моих модулей в этом году является программирование Haskell. У меня возникли проблемы с выражением сложности таким простым способом, особенно с других языков, таких как C#.Удаление n числа элементов из списка
Часть процесса ознакомления включает в себя реализацию функции 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
Я знаю, что нужно рекурсивно назвать падение»на хвосте списка, чтобы эффективно удалить элемент, но я не знаю, как вести подсчет, сколько элементов я снял, так что я могу гарантировать, что я удалите 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', возможно? – thefourtheye
Условие гарантирует, что элементы удаляются только в том случае, если x не равен 0, поэтому в первом случае это должно быть: 5 = 1 удалено, 4 = 2 удалено, 3 = 3 удалено, 2 = 4 удалено, 1 = 5 удалено , Но это не так! – Bradley