Непонятно, что означает «рекурсия не допускается, используйте итерацию». Все функции, которые кажутся «итеративными», являются рекурсивными внутри.
iterate
во всех ваших целях может изменять только вход с константой, а iterate (+1) 1
- это то же, что и [1..]
. Рассмотрите возможность использования Data.List
функцию, которая может объединить несколько из бесконечного диапазона [1..]
и ранее вычисленную сумму, чтобы произвести бесконечный список таких сумм:
T_i = я + T_ {я-1}
Это определенно дешевле чем x*(x+1) div 2
Рассмотрите возможность использования функции Data.List
, которая может создавать бесконечный список конечных списков сумм из бесконечного списка сумм. Это будет дешевле, чем вычисление списка из 10, затем список из 11 повторяющихся тех же вычислений, выполненных для списка из 10 и т. Д.
Я не думаю, что это решение закрытой формы считается итерацией. Хотя это, безусловно, лучший подход. –
Если инструкция домашней задачи содержит «не использовать рекурсию» (трудно представить, по какой конкретной причине она может быть использована здесь), это решение можно интерпретировать как действительное. –
это не сработало – user2277918