Рекурсия, складывание 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(), которая возвращает результат вычисления числа в последовательности.
- Результат выводится на экран.
- Пользователю предлагается нажать любую клавишу, чтобы продолжить выполнение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д