Рекурсия. А нужно ли использовать?
- Войдите на сайт для отправки комментариев
Вс, 03/01/2021 - 14:44
Именно для программирования микроконтроллеров.
Можно же заменить циклами (ниже пример). Скорость та же. Ну кода побольше, зато рекурсия больше памяти "съедает".
// Функция рассчёта факториала рекурсией
uint32_t Fact1(uint32_t f) {
if (f < 2) return 1;
return f * Fact1(f - 1);
}
// Функция рассчёта факториала циклом
uint32_t Fact2(uint8_t f) {
if (f < 2) return 1;
uint32_t rez = 1;
for (uint8_t i = f; f > 1; f--)
rez *= f;
return rez;
}
void setup()
{
Serial.begin(9600);
uint32_t rez;
Serial.println(F("Расчёт факториала числа 30"));
Serial.print(F("Через рекурсию: "));
uint32_t start = micros();
rez = Fact1(30);
uint32_t duration = micros() - start;
Serial.println(rez);
Serial.print(F("Время расчёта: "));
Serial.print(duration);
Serial.println(F(" микросекунд"));
Serial.println();
Serial.print(F("Через цикл for: "));
start = micros();
rez = Fact2(30);
duration = micros()- start;
Serial.println(rez);
Serial.print(F("Время расчёта: "));
Serial.print(duration);
Serial.println(F(" микросекунд"));
}
void loop() {}
Результат:
Расчёт факториала числа 30 Через рекурсию: 1409286144 Время расчёта: 168 микросекунд Через цикл for: 1409286144 Время расчёта: 168 микросекунд
Обязательно. Иначе приедут из "управления К" и арестуют. Еще идиотские вопросы будут?
А такие расчеты при оптимизации во время компиляции кода не упрощаются до одинакового набора операций?
Её (как и всё остальное) нужно уметь готовить.
А как это работает? А если взять количество итерацций больше ОЗУ это не сломается?
А да, переполнение uint32_t я не посмотрел, после 12! идут уже неверные результаты.
Андрей, рекурсия нужна не компьютеру, а программисту. Если рекурсия вам помогает - ее надо использовать, а если нет - то нет