Рекурсия, складывание 3 предыдущих чисел ( нечто похожее на Фибоначчи) - C (СИ)

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

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

Доброго времени суток. Использую рекурсию чтобы решить следующую задачу: foo(0)=2 foo(1)=3 foo(2)=5 foo(n)= foo(n−1)+ foo(n−2)+ foo(n−3) Т.е. получаем такую последовательность: "2 3 5 10 18 33 61 112 ..." Вот примерны код, который я модифицировал. При n=5 мне необходимо получить "18", а я "1 теряю и дальше уже отклонение идет:
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int fib(int n);
  4. int _fib(int n,int n3, int n2, int n1);
  5. int fib(int n){
  6. return _fib(n,5,3,2);
  7. }
  8. int _fib(int n,int n3, int n2, int n1){
  9. if (n==0){
  10. return 1;
  11. }
  12. else if(n == 1){
  13. return n1;
  14. }
  15. else if(n == 2){
  16. return n2;
  17. }
  18. else if(n==3){
  19. return n3;
  20. }
  21. else{
  22. return _fib(n-1, n1 +n2+n3 ,n2 + n1,n1);
  23. }
  24. }
  25. int main(){
  26. printf("%d\n", fib(5));
  27. return 0;
  28. }
up.
В чем причина того, что 4 элемент уже отклоняется?

Решение задачи: «Рекурсия, складывание 3 предыдущих чисел ( нечто похожее на Фибоначчи)»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int superFib(int n, int c, int p, int pp)
  5. {
  6.     switch (n)
  7.            {
  8.              case 3:
  9.                   return c;
  10.              case 2:
  11.                   return p;
  12.              case 1:
  13.                   return pp;    
  14.              default:
  15.                   return superFib(n-1,c+p+pp,c,p);  
  16.             }    
  17. }
  18.  
  19. int main(int argc, char *argv[])
  20. {
  21.   int n;
  22.   printf("n=");
  23.   scanf("%d",&n);
  24.   printf("%d\n",superFib(n,5,3,2));
  25.  
  26.   system("PAUSE"); 
  27.   return 0;
  28. }

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

В этом коде реализована функция superFib(), которая вычисляет число в последовательности, похожей на Фибоначчи, но с определенными особенностями. В функции superFib() используются четыре параметра:

  1. n - номер числа в последовательности, которое нужно вычислить.
  2. c - первое число в последовательности.
  3. p - второе число в последовательности.
  4. pp - третье число в последовательности. Функция superFib() использует оператор switch для определения номера числа в последовательности, которое нужно вычислить. Если n=3, функция возвращает значение c. Если n=2, функция возвращает значение p. Если n=1, функция возвращает значение pp. Если n больше 3, функция рекурсивно вызывает саму себя, передавая в качестве параметров n-1, c+p+pp, c, p. В функции main() происходит следующее:
  5. Пользователю предлагается ввести значение переменной n.
  6. Значение n передается в функцию superFib(), которая возвращает результат вычисления числа в последовательности.
  7. Результат выводится на экран.
  8. Пользователю предлагается нажать любую клавишу, чтобы продолжить выполнение программы.

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


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

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

10   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы