踏踏实实干工作,推进开源大发展!

第一次动脑筋写erlang程序

2008-02-13 14:22:39 / 个人分类:软件使用

来自网络:


  如果一门计算机语言不能影响你对编程的看法,那根本就不必知晓。

  那按这个说法的话,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)).

TAG: 软件使用

我来说两句

-5 -3 -1 - +1 +3 +5

Open Toolbar