A language that doesn't affect the way you think about programming, is not worth knowing.
--Alan J. Perlis
如果一门计算机语言不能影响你对编程的看法,那根本就不必知晓
那按这个说法的话,erlang值得我们了解的语言之一,因为erlang将“并行"集成到语言当中,
内置并行编程模型的编程语言多多少少都得益于Functional Programming,
(包括现在主流的java,也有一些FP特性)
用FP语言来解数学计算问题是很有趣的,以前就从g9的blog上听说这个好玩的地方
http://projecteuler.net
不过区区一直都赖得去晃。
虽然平时是个老实的C++程序员,但是本着重在参与的原则,区区也就看了几篇erlang的tuturial,
发现内容与SICP相比实在只能算是子集,不过掌握基本语法之后,练习一下是必要的,找谁呢?
projecteuler呗~
-module(m1).
-compile(export_all).
%%utils
find(_, []) -> [];
find(Pred, [H|T]) ->
Flag = (Pred(H)),
if
Flag ->
H;
true ->
find(Pred, T)
end.
%%euler #3
bpf(N) ->
bigest_prime_factor(N).
bpf_iter(Current, N, Biggest) ->
if
N rem Current == 0 ->
bpf_iter(Current, N div Current, Current);
Current < N ->
bpf_iter(Current + 1 , N, Biggest);
true ->
Biggest
end.
bigest_prime_factor(N) ->
bpf_iter(2, N, 1).
%%euler #4
is_mul_of_3(N) ->
length([Y || Y <- lists:seq(100,999)
, N rem Y == 0
, N div Y < 1000
, N div Y >99]) > 0.
is_pal(N) ->
integer_to_list(N) == lists:reverse(integer_to_list(N)).
bpi_find() -> %now we use find/1
find(fun(X) -> is_pal(X) and is_mul_of_3(X) end,lists:seq(1000000, 1, -1)).
%%euler #5
gcd(M,N) ->
if
N > M ->
gcd(N,M);
M rem N == 0 ->
N;
true ->
gcd(N, M rem N)
end.
ben_find(N) ->
lists:foldl(fun (X,Acc) -> X * Acc div gcd(X, Acc) end, 1, lists:seq(1,N)).
--Alan J. Perlis
如果一门计算机语言不能影响你对编程的看法,那根本就不必知晓
那按这个说法的话,erlang值得我们了解的语言之一,因为erlang将“并行"集成到语言当中,
内置并行编程模型的编程语言多多少少都得益于Functional Programming,
(包括现在主流的java,也有一些FP特性)
用FP语言来解数学计算问题是很有趣的,以前就从g9的blog上听说这个好玩的地方
http://projecteuler.net
不过区区一直都赖得去晃。
虽然平时是个老实的C++程序员,但是本着重在参与的原则,区区也就看了几篇erlang的tuturial,
发现内容与SICP相比实在只能算是子集,不过掌握基本语法之后,练习一下是必要的,找谁呢?
projecteuler呗~
-module(m1).
-compile(export_all).
%%utils
find(_, []) -> [];
find(Pred, [H|T]) ->
Flag = (Pred(H)),
if
Flag ->
H;
true ->
find(Pred, T)
end.
%%euler #3
bpf(N) ->
bigest_prime_factor(N).
bpf_iter(Current, N, Biggest) ->
if
N rem Current == 0 ->
bpf_iter(Current, N div Current, Current);
Current < N ->
bpf_iter(Current + 1 , N, Biggest);
true ->
Biggest
end.
bigest_prime_factor(N) ->
bpf_iter(2, N, 1).
%%euler #4
is_mul_of_3(N) ->
length([Y || Y <- lists:seq(100,999)
, N rem Y == 0
, N div Y < 1000
, N div Y >99]) > 0.
is_pal(N) ->
integer_to_list(N) == lists:reverse(integer_to_list(N)).
bpi_find() -> %now we use find/1
find(fun(X) -> is_pal(X) and is_mul_of_3(X) end,lists:seq(1000000, 1, -1)).
%%euler #5
gcd(M,N) ->
if
N > M ->
gcd(N,M);
M rem N == 0 ->
N;
true ->
gcd(N, M rem N)
end.
ben_find(N) ->
lists:foldl(fun (X,Acc) -> X * Acc div gcd(X, Acc) end, 1, lists:seq(1,N)).