Рекурсия, складывание 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 теряю и дальше уже отклонение идет:
#include <stdio.h>
#include <stdlib.h>
 
int fib(int n);
int _fib(int n,int n3, int n2, int n1);
 
int fib(int n){
 
    return _fib(n,5,3,2);
}
 
int _fib(int n,int n3, int n2, int n1){
    
    if (n==0){
        return 1;
    }
    else if(n == 1){
        return n1;
    }
    else if(n == 2){
        return n2;
    }
    else if(n==3){
        return n3;
    }
    else{
        return _fib(n-1, n1 +n2+n3 ,n2 + n1,n1);
    }
}
 
int main(){
  printf("%d\n", fib(5));
  return 0;
}
up.
В чем причина того, что 4 элемент уже отклоняется?

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

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
 
int superFib(int n, int c, int p, int pp)
{
    switch (n)
           {
             case 3:
                  return c;
             case 2:
                  return p;
             case 1:
                  return pp;     
             default:
                  return superFib(n-1,c+p+pp,c,p);   
            }    
}
 
int main(int argc, char *argv[])
{
  int n;
  printf("n=");
  scanf("%d",&n);
  printf("%d\n",superFib(n,5,3,2));
  
  system("PAUSE");  
  return 0;
}

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

В этом коде реализована функция 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
Похожие ответы