В настоящее время я работаю над проблемой проекта euler 14.
Я решил это с использованием плохо кодированной программы без заметок, которая запустила 386 5 секунд (см. править).
Вот он:
step :: (Integer, Int) -> Integer -> (Integer, Int)
step (i, m) n | nextValue > m = (n, nextValue)
| otherwise = (i, m)
where nextValue = syr n 1
syr :: Integer -> Int -> Int
syr 1 acc = acc
syr x acc | even x = syr (x `div` 2) (acc + 1)
| otherwise = syr (3 * x + 1) (acc + 1)
p14 = foldl step (0, 0) [500000..999999]
Мой вопрос о нескольких комментариях в теме, связанной с этой проблемой, где упоминалось время выполнения < 1 s для следующих программ (код C, кредиты для пользователя форума проекта eiler ix для кода - примечание: я не проверял, что время выполнения фактически упоминается):
#include <stdio.h>
int main(int argc, char **argv) {
int longest = 0;
int terms = 0;
int i;
unsigned long j;
for (i = 1; i <= 1000000; i++) {
j = i;
int this_terms = 1;
while (j != 1) {
this_terms++;
if (this_terms > terms) {
terms = this_terms;
longest = i;
}
if (j % 2 == 0) {
j = j / 2;
} else {
j = 3 * j + 1;
}
}
}
printf("longest: %d (%d)\n", longest, terms);
return 0;
}
Для меня эти программы являются одними и теми же, когда речь идет об алгоритме.
Так что я удивляюсь, почему существует такая большая разница? Или есть какая-то принципиальная разница между нашими двумя алгоритмами, которые могут оправдать фактор x6 в производительности?
Кстати, я в настоящее время пытаюсь реализовать этот алгоритм с помощью memoization, но я как бы потерял меня, его проще реализовать на императивном языке (и я еще не манипулирую монадами, поэтому я не могу использовать эта парадигма). Поэтому, если у вас есть хороший учебник, который подходит новичкам для изучения memoization, я буду рад (те, с которыми я столкнулся, были недостаточно подробными или из моей лиги).
Примечание. Я пришел к декларативной парадигме через Пролог и все еще в самом раннем процессе открытия Haskell, поэтому я мог бы пропустить важные вещи.
Примечание2: любые общие советы о моем коде приветствуются.
РЕДАКТИРОВАТЬ: благодаря помощи delnan, я скомпилировал программу, и теперь она работает через 5 секунд, поэтому я в основном ищут подсказки по memoization (даже если идеи о существующем разрыве x6 по-прежнему приветствуются).