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