Найдите N-ый член последовательности, сократив количество рекурсивных вызовов - C (СИ) (75506)

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток) Будьте добры, помогите, пожалуйста, с заданием c использованием рекурсии: Определите закономерность формирования членов последовательности. Найдите N-ый член последовательности, сократив количество рекурсивных вызовов. (ф-ция в приложении) Буду премного Вам благодарен.

Решение задачи: «Найдите N-ый член последовательности, сократив количество рекурсивных вызовов»

textual
Листинг программы
#include <math.h>
#include <stdio.h>
 
int Counter; // счетчик вызова
 
double funcGood(int n, double curr, double prev)
{
    Counter++;
 
    if (n == 0)
        return curr;
    else
        return funcGood(n-1, sqrt(curr+prev),curr);
}
 
double funcBad(int n)
{
    Counter++;
 
    if (n <= 2)
        return 1.0;
    else
        return sqrt(funcBad(n-1)+funcBad(n-2));
}
 
int main(int argc, char* argv[])
{
    double r;
 
    // Неоптимальный расчет
 
    Counter=0;
    r=funcBad(20);
    printf("F=%f  C=%d\n\n",r,Counter);
 
    // Оптимальный расчет
 
    Counter=0;
    funcGood(20,1.0,1.0);
    printf("F=%f  C=%d\n\n",r,Counter);
    
    return 0;
 
}

Объяснение кода листинга программы

  1. Включаем необходимые заголовочные файлы: и .
  2. Объявляем переменную Counter для подсчета количества вызовов функций.
  3. Определяем функцию funcGood, которая принимает три аргумента: n, curr и prev.
  4. Увеличиваем счетчик вызовов на единицу.
  5. Проверяем базовый случай: если n равно нулю, то возвращаем значение curr.
  6. В противном случае, рекурсивно вызываем функцию funcGood с аргументами (n-1, sqrt(curr+prev),curr).
  7. Определяем функцию funcBad, которая принимает один аргумент n.
  8. Увеличиваем счетчик вызовов на единицу.
  9. Проверяем базовый случай: если n меньше или равно двум, то возвращаем значение 1.0.
  10. В противном случае, рекурсивно вызываем функцию funcBad с аргументами (n-1) и (n-2), и возвращаем значение sqrt(sum).
  11. В функции main создаем переменную r типа double для хранения результата.
  12. Инициализируем переменную Counter в нулевое значение.
  13. Вызываем функцию funcBad с аргументом 20 и сохраняем результат в переменную r.
  14. Выводим значение r и количество вызовов функции (Counter) на экран.
  15. Инициализируем переменную Counter в нулевое значение.
  16. Рекурсивно вызываем функцию funcGood с аргументами (20, 1.0, 1.0) и сохраняем результат в переменную r.
  17. Выводим значение r и количество вызовов функции (Counter) на экран.
  18. Возвращаем 0 из функции main, что означает успешное завершение программы.
  19. Значение переменной r в первом случае равно 1.0, а во втором - 1.0.
  20. Количество вызовов функции (Counter) в первом случае равно 21, а во втором - 20.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4 из 5
Похожие ответы