Кажется, что две функции имеют совершенно разную реализацию:
c m l = do
n <- [l..m]
res <- c (n - 1) (l - 1)
return $ n:res
Здесь при каждом рекурсивном вызове параметр l
уменьшается, а параметр m
становится n <- [l--m]
. 1118]
Для сравнения:
helper a b l = do
n <- [a..b]
True <- return $ (l - 1 <= n)
res <- helper a (n - 1) (l - 1)
return (n:res)
Здесь интервал составляет [a..b]
вместо [l..m]
(кстати, почему вы используете разные имена? Сложнее сравнивать два фрагмента таким образом. Итак, рассмотрим, как изменяются параметры a
и b
. Параметр a
не изменяется, а b
становится n-1
.
Есть также третий аргумент l
, которого не было в первом фрагменте.
Я не вижу, как это будет тот же алгоритм. Это выглядит совершенно по-другому для меня. Вы, вероятно, вызываете здесь более рекурсивные вызовы, которые замедляют работу. Сопоставление с образцом - это красная сельдь - думаю, дело не в том, что это тормозит, по крайней мере, не напрямую.
Кроме того, эта часть
n <- [a..b]
True <- return $ (l - 1 <= n)
выглядит очень подозрительно. Это должно быть что-то вроде
n <- [max a (l-1) .. b]
, поскольку вышеприведенное будет учитываться от a
до l-2
только для того, чтобы отбросить эти варианты в следующей строке. Создание вариантов только для того, чтобы отказаться от них, может замедлить вашу программу.
Щелкните правой кнопкой по представлению Source HTML / ASP-страница и избранное "Форматирование и Проверка".
мне жаль, что я не мог добавить пользовательские значения CSS также.