CDP1802
Я не знаю Хаскелла, но есть одна вещь, которая все еще должна быть действительна для функционального языка: итерация (циклы) всегда может быть заменена эквивалентной рекурсией или наоборот.
Наименее запутанное определение рекурсия[^]- это функция, которая вызывает саму себя. Каждый вызов представляет собой итерацию исходного цикла. Бесконечная рекурсия не работает (обычно она заканчивается переполнением стека), поэтому должно быть какое-то условие, которое завершает рекурсию и просто возвращает.
Для рекурсии типа "while" вам придется проверить свое состояние,чтобы решить, выполнять ли вашу функцию или возвращаться. Это с-подобный псевдокод:
ReturnType RecursiveFunction(SomeParameters)
{
if(Condition == true)
{
return;
}
else
{
// Do whatever your loop should have done,
// possibly modifying the parameters that have been passed.
// recursive call to your function
return RecursiveFunction(ModifiedParameters);
}
}
Возможно, эта ссылка может помочь:
Рекурсия-научите вас Хаскеллу для великого блага![
^]