Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [erlang] Чаво, часто задаваемые вопросы... 
:(
    Опции темы
v2v
Дата 9.3.2011, 00:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1620
Регистрация: 20.9.2006
Где: Киев

Репутация: нет
Всего: 56



Открываю для себя мир функционального программирования. Решил написать парочку тестовых програмок на языке 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. В командной строке ерланга как можно декларировать функции? Обязательно ли создавать их в отдельном файле?

--
на пока хватит.

Это сообщение отредактировал(а) v2v - 9.3.2011, 08:40


--------------------
PM   Вверх
k0rvin
Дата 9.3.2011, 07:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: нет
Всего: 5



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.


но вообще, если у Вас цель изучить именно ФП, то лучше взять Хаскелл

Это сообщение отредактировал(а) k0rvin - 9.3.2011, 08:00


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума «Функциональные языки: общие вопросы»
Void
  • Пожалуйста, создавайте темы с содержательными названиями. Если у Вас вопрос по конкретному языку, укажите его в заголовке, например: «[Haskell] Как использовать монаду State».
  • Уважаемые учащиеся, здесь всегда рады помочь Вам, но не делать за Вас вашу работу. У вас гораздо больше шансов получить помощь, если Вы приложите усилия и поделитесь с нами проблемами и результатами. В противном случае добро пожаловать в раздел Центр Помощи.
  • Получив ответ на интересующий Вас вопрос, не забудьте пометить его как решённый.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Функциональные языки: общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0747 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.