Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
EMTEC
1 / 1 / 0
Регистрация: 29.10.2011
Сообщений: 110
#1

Функция чисел Фибоначчи, предшествующих вводимому числу - C++

11.03.2012, 18:27. Просмотров 1346. Ответов 12
Метки нет (Все метки)

С помощью рекурсивной функции вычислить и вывести числа Фибоначчи, предшествующие вводимому числу
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.03.2012, 18:27
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Функция чисел Фибоначчи, предшествующих вводимому числу (C++):

Найти сумму натуральных чисел, предшествующих заданному числу a - C++
Найти сумму натуральных чисел, предшествующих заданному числу a.

Найти произведение натуральных чисел, предшествующих заданному числу a - C++
Найти произведение натуральных чисел, предшествующих заданному числу a.

По вводимому числу от 1 до 11 (номеру класса) выдать соответствующее сообщение - C++
написать программу, которая по водимому числу от 1 до 11 (номеру класса) выдает соответствующее сообщение <привет, к-классник>. ; если...

как в си ++ придать макс и мин значения вводимому числу - C++
Ребята я новичек в си ++ вот задача к примеру с датами связана как зделать так чтобы при вводе даты (почисленно)ее ограничить,к примеру...

Установить порядковый номер дня в году по вводимому числу и месяцу (Переписать со структурой) - C++
Программа устанавливает порядковый номер дня в году по вводимому числу и месяцу. Код программы нужно переписать со структурой! ...

Рекурсивная функция, которая возвращает сумму n чисел Фибоначчи - C++
Помогите решить задачу Написать рекурсивную функцию, которая возвращает сумму n чисел Фибоначчи. Число n принимается в качестве...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Duha666
51 / 51 / 5
Регистрация: 10.03.2012
Сообщений: 138
11.03.2012, 18:30 #2
C++
1
2
3
4
5
6
7
8
9
void find_fib(int a, int b, int x)
{
    if (b >= x)
        return;
    cout << b << ' ';
    find_fib(b, a + b, x);
}
 
find_fib(0, 1, x);
Черный ворон
129 / 123 / 6
Регистрация: 31.01.2012
Сообщений: 435
11.03.2012, 18:30 #3
вот здесь:
Рекурсия в нахождении числа ряда Фибоначчи.
-=ЮрА=-
Заблокирован
Автор FAQ
11.03.2012, 19:07 #4
jeka061288, я постарался одновременно показать как решать данную задачу с циклом и рекурсией
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <stdio.h>
 
int direct_fibo(int val)
{
    int fib1 = 1;
    int fib2 = 1;
    
    int fib_sum = fib2 + fib1;
    while(fib_sum <= val)
    {
        printf("%d ",fib1);
        fib_sum = fib2 + fib1;
        fib1 = fib2;
        fib2 = fib_sum;
    }
    return fib_sum;
}
 
int rekurs_fibo(int fib1, int fib2, int val)
{
    int fib_sum = fib2 + fib1;
    if(fib_sum <= val)
    {
        printf("%d ",fib1);
        fib_sum =+ rekurs_fibo(fib2, (fib1 + fib2), val);
    }
    else
        printf("%d ",fib1);
    return fib_sum;
}
 
int main()
{
    int value;
    int direct_sum;
    int rekurs_sum;
    while(1)
    {
        printf("Enter value : ");
        scanf("%d",&value);
        direct_sum = direct_fibo(value);
        printf("\ndirect_sum %d\n",direct_sum);
        rekurs_sum = rekurs_fibo(1,1,value);
        printf("\nrekurs_sum %d\n",rekurs_sum);
    }
    return 0;
}
Миниатюры
Функция чисел Фибоначчи, предшествующих вводимому числу  
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
11.03.2012, 19:15 #5
C++
1
2
3
4
long fibon(const unsigned& n)
{
   return !n || n == 1 ? 1 : fibon(n - 1) + fibon(n - 2);
}
EMTEC
1 / 1 / 0
Регистрация: 29.10.2011
Сообщений: 110
11.03.2012, 19:17  [ТС] #6
Подскажите while(1) - это бесконечный ввод и как правильно понять - как работает rekurs_sum = rekurs_fibo(1,1,value); ?
-=ЮрА=-
Заблокирован
Автор FAQ
11.03.2012, 19:31 #7
Цитата Сообщение от jeka061288 Посмотреть сообщение
Подскажите while(1) - это бесконечный ввод
- да я решил оставить возможность постоянного ввода при желании можно записать так

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
while(1)
* * * * {

* * * * * * * * printf("Enter value : ");
* * * * * * * * scanf("%d",&value);
* * * * * * * * direct_sum = direct_fibo(value);
* * * * * * * * printf("\ndirect_sum %d\n",direct_sum);
* * * * * * * * rekurs_sum = rekurs_fibo(1,1,value);
* * * * * * * * printf("\nrekurs_sum %d\n",rekurs_sum);
* * * * }
- всё что красным убираем и получаем одноразовый ввод
EMTEC
1 / 1 / 0
Регистрация: 29.10.2011
Сообщений: 110
11.03.2012, 19:31  [ТС] #8
Спасибо ,понял.
-=ЮрА=-
Заблокирован
Автор FAQ
11.03.2012, 19:35 #9
Цитата Сообщение от jeka061288 Посмотреть сообщение
и как правильно понять - как работает rekurs_sum = rekurs_fibo(1,1,value); ?
- я специально приводил всесте и
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
int direct_fibo(int val)
и
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
int rekurs_fibo(int fib1, int fib2, int val)
, они имеют аналогичный функционал и логику, рекурсия как бы заменяет цикл, мы вызываем функцию повторно вместо того чтобы переходить к след итерации.

Смотри тут изменяем величины в цикле
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
fib_sum = fib2 + fib1;
* * * * * * * * fib1 = fib2;
* * * * * * * * fib2 = fib_sum;
,
а здесь вместо того чтобы организовывать итерации, просто вызываем функцию с изменёнными аргументами
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
fib_sum =+ rekurs_fibo(fib2, (fib1 + fib2), val);
Тут для понимания лучше всего поможет пошаговое прохождение алгоритма

Добавлено через 1 минуту
jeka061288, рекурсия подразумевает повторный вызов функции внутри её тела, благодаря чему возможно изменение её аргументов без итераций, т.е. как бы вызываем функцию уже с результатами предыдущих расчётов
EMTEC
1 / 1 / 0
Регистрация: 29.10.2011
Сообщений: 110
11.03.2012, 19:37  [ТС] #10
Благодарю вас за помощь и разъяснения ,все понятно!
Черный ворон
129 / 123 / 6
Регистрация: 31.01.2012
Сообщений: 435
11.03.2012, 20:50 #11
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
jeka061288, я постарался одновременно показать как решать данную задачу с циклом и рекурсией
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <stdio.h>
 
int direct_fibo(int val)
{
    int fib1 = 1;
    int fib2 = 1;
    
    int fib_sum = fib2 + fib1;
    while(fib_sum <= val)
    {
        printf("%d ",fib1);
        fib_sum = fib2 + fib1;
        fib1 = fib2;
        fib2 = fib_sum;
    }
    return fib_sum;
}
 
int rekurs_fibo(int fib1, int fib2, int val)
{
    int fib_sum = fib2 + fib1;
    if(fib_sum <= val)
    {
        printf("%d ",fib1);
        fib_sum =+ rekurs_fibo(fib2, (fib1 + fib2), val);
    }
    else
        printf("%d ",fib1);
    return fib_sum;
}
 
int main()
{
    int value;
    int direct_sum;
    int rekurs_sum;
    while(1)
    {
        printf("Enter value : ");
        scanf("%d",&value);
        direct_sum = direct_fibo(value);
        printf("\ndirect_sum %d\n",direct_sum);
        rekurs_sum = rekurs_fibo(1,1,value);
        printf("\nrekurs_sum %d\n",rekurs_sum);
    }
    return 0;
}
хм... мне очень долгое время преподаватель всё продолжает упорно объяснять, что "двойное" сравнение как в 10 строке ( while(fib_sum <= val) ) не есть хорошо. вроде как это два сравнения и сработает медленнее чем инкрементация переменной (в данном случае val) перед циклом и в условии выхода сравнение только "<".
так как же всё-таки более правильно?
-=ЮрА=-
Заблокирован
Автор FAQ
11.03.2012, 21:13 #12
Черный ворон, если нужно пропечатать все числа фибоначи до указанного числа то следует использовать именно такое условие,как вариант попробуй изменить условие на меньше и погляди что станет с выводом.,Использование того или иного условия обусловлено требованиями алгоритма,а не требованиями преподавателя...
Изображения
 
-=ЮрА=-
Заблокирован
Автор FAQ
11.03.2012, 21:16 #13
Чтобы снять все вопросы, предлагаю провести сравнение для ввода 89

Отработка с условием <=
Enter value : 89
1 1 2 3 5 8 13 21 34 55
direct_sum 144
1 1 2 3 5 8 13 21 34 55
rekurs_sum 144
Enter value :

Отработка с условием <
Enter value : 89
1 1 2 3 5 8 13 21 34
direct_sum 89
1 1 2 3 5 8 13 21 34
rekurs_sum 89
Enter value :

Как видим для условия < в ряде отсутсвует 55
Использование того или другого условия диктуется требованиями алгоритма и реализации,
если бы условие <= было ненужным его бы попросту исключили из операторов языка, но почему то же не исключают.
Не вопрос 90% задач могут быть решены без этого условия, остальные 10% никак не могут
или же обход этого условия колоссально увеличит сложность алгоритма...

Добавлено через 53 секунды
Резюме
Цитата Сообщение от Черный ворон Посмотреть сообщение
while(fib_sum <= val) ) не есть хорошо
- правда?
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
90% задач могут быть решены без этого условия, остальные 10% никак не могут или же обход этого условия колоссально увеличит сложность алгоритма...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.03.2012, 21:16
Привет! Вот еще темы с ответами:

Произведение и сумма отрицательных элементов последовательности, предшествующих первому положительному числу - C++
Найти произведение и сумму отрицательных элементов последовательности предшествующих первому положительному числу

Рекурсивная функция: вычисление суммы чисел Фибоначчи, пока они меньше введенного числа - C++
Вроде примитивная задача, но реализовать не смог, да и нигде такого не обсуждалось, так что вот: Требуется реализовать рекурсивную функцию,...

Вычислить среднее геометрическое тех элемнтов последовательности предшествующих первому отрицательное числу - C++
дано 9 действительных чисел. Вычислить среднее геометрическое тех элемнтов последовательности предшествующих первому отрицательное числу

Функция, которая для заданного целого числа m находит среди первых m^2-1 чисел Фибоначчи хотя бы одно, делящееся на m (перевести на Си) - C++
Условие: Напишите функцию, которая для заданного целого числа m находит среди первых m2-1 чисел Фибоначчи хотя бы одно, делящееся на m ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
11.03.2012, 21:16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru