Created
June 28, 2017 15:16
-
-
Save andreburgaud/b4fa81a3ad491ed89d1c41ea1d8e110f to your computer and use it in GitHub Desktop.
FutureLearn - Functional Programming in Erlang 2.11 - Where do I begin?
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-module(more_lists). | |
-export([reverse/1,take/2,take2/2,test_take/0,test_take2/0]). | |
%% Take with direct recursion | |
-spec take(integer(), [T]) -> [T]. | |
take(_, []) -> []; % handles case where N > length(Xs) | |
take(0, _) -> []; | |
take(N, [X|Xs]) when N > 0 -> [X | take(N-1, Xs)]. | |
test_take() -> | |
[] = take(0,"hello"), | |
"hell" = take(4,"hello"), | |
"hello" = take(5,"hello"), | |
"hello" = take(9,"hello"), | |
success. | |
%% Reverse a list (helper for the tail recursive take). | |
-spec reverse([T]) -> [T]. | |
reverse(Xs) -> reverseR(Xs, []). | |
-spec reverseR([T], [T]) -> [T]. | |
reverseR([], Ys) -> Ys; | |
reverseR([X|Xs], Ys) -> reverseR(Xs, [X|Ys]). | |
%% Take with tail recursion | |
-spec take2(integer(), [T]) -> [T]. | |
take2(N, Xs) -> reverse(takeR(N, Xs, [])). | |
%% Helper for tail recursive take | |
-spec takeR(integer(), [T], [T]) -> [T]. | |
takeR(_, [], Ys) -> Ys; | |
takeR(0, _, Ys) -> Ys; | |
takeR(N, [X|Xs], Ys) when N > 0 -> | |
takeR(N-1, Xs, [X | Ys]). | |
test_take2() -> | |
[] = take2(0,"hello"), | |
"hell" = take2(4,"hello"), | |
"hello" = take2(5,"hello"), | |
"hello" = take2(9,"hello"), | |
success. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment