[erlang] Чаво

 
0
 
Functional languages
ava
v2v | 09.03.2011, 00:22
Открываю для себя мир функционального программирования. Решил написать парочку тестовых програмок на языке erlang что бы понять возможности/преимущества/недостатки. Естественно сразу появились вопросы. В связи с необразованностью в этой области некоторые вопросы будут звучать глупо, не ругайте сильно.

Собственно программа на которой я застрял - вычисление суммы всех простых чисел меньше Н. Правильный рабочий код получилось написать довольно быстро, но вот получить желаемого результата не удаётся.
Дело в том что квадратичная сложность кода делает его непригодным для чисел больше нескольких сот тысяч.
1. Не хватает аккумулятора (переменной в памяти), куда можно было бы скидывать уже найденные простые числа, и пользоваться при следующих итерациях. Как жить без переменных?


sum_prime_below(1) -> 0
sum_prime_below(X) ->
    is_prime(X)*X+sum_prime_below(X-1).

is_prime(X) -> is_prime_local(X,2).

is_prime_local(X,I) ->
    if
      X == I        -> 1;
      X rem I == 0    -> 0;
      true            -> is_prime_local(X,I+1)
    end.


2. При попытке в условном операторе if вызвать функцию, компилятор ругается. Так нельзя делать? Почему?


sum_prime_below(X) ->
if is_prime(X) ==0 ->
X+sum_prime_below(X-1);
true ->
sum_prime_below(X-1)
end.


3. В командной строке ерланга как можно декларировать функции? Обязательно ли создавать их в отдельном файле?

--
на пока хватит.
Comments (1)
ava
k0rvin | 09.03.2011, 07:56 #
1. передавайте аккумулятор параметром:

sum_prime_below(X) -> sum_prime_local(X, 0).

sum_prime_local(X, Acc) ->
    if
      X == 0 -> Acc;
      true   -> sum_prime_local( X-1, Acc + is_prime(X)*X )
    end.

собсвенно единственная ошибка в Вашем коде -- отсутствие проверки X == 0 в sum_prime_below, отчего она уходит в бесконечную рекурсию. можно и так написать:

sum_prime_below(X) ->
    if
      X == 0 -> 0;
      true   -> is_prime(X)*X + sum_prime_below(X-1)
    end.


но вообще, если у Вас цель изучить именно ФП, то лучше взять Хаскелл
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
  v2v   k0rvin
advanced
Submit