Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
1 / 1 / 0
Регистрация: 29.10.2011
Сообщений: 110
1

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

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

Author24 — интернет-сервис помощи студентам
С помощью рекурсивной функции вычислить и вывести числа Фибоначчи, предшествующие вводимому числу
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.03.2012, 18:27
Ответы с готовыми решениями:

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

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

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

Найти сумму чисел предшествующих первому отрицательное числу последовательности
Написать программу которая находит сумму чисел, которые предшествующих первому отрицательное числу...

12
53 / 53 / 19
Регистрация: 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);
1
138 / 132 / 57
Регистрация: 31.01.2012
Сообщений: 435
11.03.2012, 18:30 3
вот здесь:
Рекурсия в нахождении числа ряда Фибоначчи.
1
Заблокирован
Автор 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;
}
Миниатюры
Функция чисел Фибоначчи, предшествующих вводимому числу  
1
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
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);
}
0
1 / 1 / 0
Регистрация: 29.10.2011
Сообщений: 110
11.03.2012, 19:17  [ТС] 6
Подскажите while(1) - это бесконечный ввод и как правильно понять - как работает rekurs_sum = rekurs_fibo(1,1,value); ?
0
Заблокирован
Автор 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);
* * * * }
- всё что красным убираем и получаем одноразовый ввод
1
1 / 1 / 0
Регистрация: 29.10.2011
Сообщений: 110
11.03.2012, 19:31  [ТС] 8
Спасибо ,понял.
0
Заблокирован
Автор 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, рекурсия подразумевает повторный вызов функции внутри её тела, благодаря чему возможно изменение её аргументов без итераций, т.е. как бы вызываем функцию уже с результатами предыдущих расчётов
1
1 / 1 / 0
Регистрация: 29.10.2011
Сообщений: 110
11.03.2012, 19:37  [ТС] 10
Благодарю вас за помощь и разъяснения ,все понятно!
0
138 / 132 / 57
Регистрация: 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) перед циклом и в условии выхода сравнение только "<".
так как же всё-таки более правильно?
0
Заблокирован
Автор FAQ
11.03.2012, 21:13 12
Черный ворон, если нужно пропечатать все числа фибоначи до указанного числа то следует использовать именно такое условие,как вариант попробуй изменить условие на меньше и погляди что станет с выводом.,Использование того или иного условия обусловлено требованиями алгоритма,а не требованиями преподавателя...
Изображения
 
1
Заблокирован
Автор 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% никак не могут или же обход этого условия колоссально увеличит сложность алгоритма...
0
11.03.2012, 21:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.03.2012, 21:16
Помогаю со студенческими работами здесь

Вычислить сумму тех натуральных чисел от 1 до 50, которые кратны числу, вводимому с клавиатуры
Написать программу, которая вычисляет сумму тех натуральных чисел от 1 до 50, которые кратны числу....

Написать программу,которая вычисляет сумму тех натуральных чисел от 1 до 50, которые кратны числу, вводимому с клавиатуры
Написать программу,которая вычисляет сумму тех натуральных чисел от 1 до 50, которые кратны числу,...

Создать файл, компоненты которого случайные целые числа. Подсчитать количество чисел в файле кратных числу k, вводимому
Создать файл, компоненты которого случайные целые числа. Подсчитать количество чисел в файле...

Напечатать сумму чисел, предшествующих максимальному числу
Дан массив целых чисел А(ai),где i=(1,2...n). Напечатать сумму чисел,предшествующих максимальному...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru