-module(seq).
-compile(export_all).
seq(X) -> seq(0,X,1).
seq(X,Y) -> seq(X,Y,1).
seq(X,X,_Z) -> [X];
seq(X,Y,Z) when X > Y , Z > 0 -> [];
seq(X,Y,Z) when Z > 0 -> [X | seq(X+Z, Y, Z)];
seq(X,Y,Z) -> lists:reverse(seq(Y, X, -1 * Z)).
でもこれだとX,Y,Zが整数かどうかしらべてやってないのでよろしくないとおもうので
is_Integer(X)をいれて判定、通らなければエラーで落ちる
もしZが正ならそのままseq_calを計算、負なら逆さにしてseq_calしてリバース
判定をしてからseq_calに処理を丸投げしました。
-module(seq).
-compile(export_all).
seq(X) when is_integer(X) -> seq_cal(0,X,1).
seq(X,Y) when is_integer(X),is_integer(Y) -> seq_cal(X,Y,1).
seq(X,Y,Z) when is_integer(X),is_integer(Y),is_integer(Z) ->
case Z > 0 of
true -> seq_cal(X,Y,Z);
false -> lists:reverse(seq_cal(Y, X, -1 * Z))
end.
seq_cal(X,X,_Z) -> [X];
seq_cal(X,Y,_Z) when X > Y -> [];
seq_cal(X,Y,Z) -> [X | seq_cal(X+Z, Y, Z)].
そうすると四つ目の引数に手続きを食わせるとか
つくってみたり。
seq(X,Y,Z,F) ->
lists:map(F,seq(X,Y,Z)).
結果
> seq:seq(1,5,1,fun (X) -> X+10 end).
[11,12,13,14,15]
reverseは遅いですね
そして末尾再起でもないし
書き直して比べてみよう
