Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Смысл кода вычисляющего число Фибоначчи 
:(
    Опции темы
n199a
Дата 30.5.2013, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.11.2011

Репутация: нет
Всего: нет



Очередное число Фибоначчи зависит только от двух предыдущих, которые будем
хранить в переменных f1 и f2. Сначала примем f1=1 и f2=0, затем вычисляем следующее
число Фибоначчи и записываем его в переменную x. Теперь значение f2 уже не нужно и мы
скопируем f1 в f2 и x в f1.


Приводится код:
Код

int Fib2(int n)
{
int i, f1 = 1, f2 = 0, x;
for (i = 2; i <= n; i ++) {
x = f1 + f2; // следующее число
f2 = f1; f1 = x; // сдвиг значений
}
return x;
}

Вопросы:
1) Зачем писать x = f1 + f2, если можно написать x = f1?
2) Зачем писать f1 = x ?
Если разобраться, то это код только возвращает в функцию Fib2 единицу (n-2) раз.

В подтверждение:
Допустим n = 5.
i = 2, пока 2 < 5, то будем добавлять к 2 по 1 последовательно, предварительно выполнив:
х = 0 + 1;
f2 = 1;
1 = x;
т.е. 1 будет всегда равно 1 и х будет возвращать число 1 в функцию Fib2 3 раза. Получается 1 будет умножаться на 1 три раза.

В чем смысл?

PM MAIL   Вверх
Arantir
Дата 30.5.2013, 01:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: нет
Всего: 55



Цитата(n199a @  30.5.2013,  00:06 Найти цитируемый пост)
1 = x;

Что это должно означать? o_O


Цитата(n199a @  30.5.2013,  00:06 Найти цитируемый пост)
т.е. 1 будет всегда равно 1

true, без сомнения...


Цитата(n199a @  30.5.2013,  00:06 Найти цитируемый пост)
 х будет возвращать число 1 в функцию Fib2 3 раза. Получается 1 будет умножаться на 1 три раза.

Код

int Fib2(int n)
{
    int i, f1 = 1, f2 = 0, x = 0;
    for (i = 2; i <= n; i ++) {
        cout << "x = " << x << "; f1 = " << f1 << "; f2 = " << f2 << "; \n"; // добавьте вывода тут ...
        x = f1 + f2; // следующее число
        f2 = f1; f1 = x; // сдвиг значений
        cout << "x = " << x << "; f1 = " << f1 << "; f2 = " << f2 << "; \n\n"; // ... и тут
    }
    return x;
}
Код

x = 0; f1 = 1; f2 = 0;
x = 1; f1 = 1; f2 = 1;

x = 1; f1 = 1; f2 = 1;
x = 2; f1 = 2; f2 = 1;

x = 2; f1 = 2; f2 = 1;
x = 3; f1 = 3; f2 = 2;

x = 3; f1 = 3; f2 = 2;
x = 5; f1 = 5; f2 = 3;

не сходится с вашими словами...

Цитата(n199a @  30.5.2013,  00:06 Найти цитируемый пост)
Получается 1 будет умножаться на 1 три раза.

А где там умножение?

Добавлено @ 01:45
Цитата(n199a @  30.5.2013,  00:06 Найти цитируемый пост)
1) Зачем писать x = f1 + f2, если можно написать x = f1?

Если так сделать, то ничего не получится... Но если Вам показалось, что это можно реализовать с помощью всего-лишь двух переменных, то это действительно возможно:
Код

int Fib(int n)
{
    int 
        f1 = 1, 
        f2 = 0;

    for (int i = 2; i <= n; i ++) 
    {
        f1 = f1 + f2;
        f2 = f1 - f2;
    }

    return f1;
}
Код

for (int i = 1; i <= 7; i ++) 
{
    cout << "Fib(" << i << ") = " << Fib(i) << endl;
}
// Fib(1) = 1
// Fib(2) = 1
// Fib(3) = 2
// Fib(4) = 3
// Fib(5) = 5
// Fib(6) = 8
// Fib(7) = 13


Это сообщение отредактировал(а) Arantir - 30.5.2013, 01:46


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
feodorv
Дата 30.5.2013, 04:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(n199a @  30.5.2013,  02:06 Найти цитируемый пост)
1 = x;

Вообще-то, "равно" - это оператор присваивания:
Код
x = 1;
в ячейку памяти с именем x помещается значение 1;
Код
x = y;
в ячейку памяти с именем x помещается значение, находящееся в ячейке памяти с именем y. В C/C++ такие ячейки памяти называют переменными.

Поэтому последовательность операторов
Цитата(n199a @  30.5.2013,  02:06 Найти цитируемый пост)
x = f1 + f2; // следующее число
f2 = f1; f1 = x; // сдвиг значений

переводится как:
  • значением переменной (с именем) x становится сумма значений переменных f1 и f2
  • значением переменной f2 становится значение переменной f1
  • значением переменной f1 становится значение переменной x


Цитата(n199a @  30.5.2013,  02:06 Найти цитируемый пост)
2) Зачем писать f1 = x ?

Как раз затем, чтобы поменять значение переменной f1 на значение переменной x (если x равнялось пяти, то после f1 = x; значением f1 также становится пять, хотя до присваивания могло равняться чему угодно))))

Цитата(n199a @  30.5.2013,  02:06 Найти цитируемый пост)
1) Зачем писать x = f1 + f2, если можно написать x = f1?

x = f1 + f2 и x = f1 дают совершенно разный результат: в первом случае значением переменной x становится сумма значений переменных f1 и f2; во втором - только лишь значение переменной f1.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
n199a
Дата 30.5.2013, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.11.2011

Репутация: нет
Всего: нет



Код

int Fib2(int n)
{
int i, f1 = 1, f2 = 0, x;
for (i = 2; i <= n; i ++) {
x = f1 + f2; // следующее число
f2 = f1; f1 = x; // сдвиг значений
}
return x;
}


Смотрите.
Пусть n равно 5.
И так, что происходит в цикле for:
Получается, что в независимости от того, чему будет сначала равна переменная x, в итоге получим x = 1. Т.е. только единица будет возвращаться в Fib2.

*******************************************

Цитата(Arantir @  30.5.2013,  01:32 Найти цитируемый пост)
1 = x;

Что это должно означать? o_O

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

Добавлено @ 18:11
Код

int Fib2(int n)
{
    int i, f1 = 1, f2 = 0, x = 0;
    for (i = 2; i <= n; i ++) {
        cout << "x = " << x << "; f1 = " << f1 << "; f2 = " << f2 << "; \n"; // добавьте вывода тут ...
        x = f1 + f2; // следующее число
        f2 = f1; f1 = x; // сдвиг значений
        cout << "x = " << x << "; f1 = " << f1 << "; f2 = " << f2 << "; \n\n"; // ... и тут
    }
    return x;
}

Я ещё не учил про то, как используется <<, по этому не могу ничего сказать.

Как получилось это:
Код

х = 0; f1 = 1; f2 = 0;
x = 1; f1 = 1; f2 = 1;
x = 1; f1 = 1; f2 = 1;
x = 2; f1 = 2; f2 = 1;
x = 2; f1 = 2; f2 = 1;
x = 3; f1 = 3; f2 = 2;
x = 3; f1 = 3; f2 = 2;
x = 5; f1 = 5; f2 = 3;


Добавлено @ 18:14
feodorv, про это:
Код

значением переменной (с именем) x становится сумма значений переменных f1 и f2
значением переменной f2 становится значение переменной f1
значением переменной f1 становится значение переменной x

мне знакомо. Вы не так поняли то, что я писал. Акцент делается на слово тогда:
Зачем ТОГДАписать приравнивание?
Т.е.:
Код

Это не код, а просто математические вычисления.
a = 2, b = 0;
x = a + b
x = 2 + 0 = 2
x = a
Зачем в этом случае писать x = a, если это и так будет понятно? Вот в таком контексте стоит рассматривать мой пример.



Это сообщение отредактировал(а) n199a - 30.5.2013, 18:16
PM MAIL   Вверх
mes
Дата 30.5.2013, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(n199a @  30.5.2013,  17:07 Найти цитируемый пост)
Это не код, а просто математические вычисления.
a = 2, b = 0;
x = a + b
x = 2 + 0 = 2
x = a
Зачем в этом случае писать x = a, если это и так будет понятно? Вот в таком контексте стоит рассматривать мой пример.


потому что б не всегда 0...


--------------------
PM MAIL WWW   Вверх
n199a
Дата 30.5.2013, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.11.2011

Репутация: нет
Всего: нет



Цитата(mes @  30.5.2013,  18:22 Найти цитируемый пост)
потому что б не всегда 0... 

А?
PM MAIL   Вверх
Arantir
Дата 30.5.2013, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: нет
Всего: 55



Цитата(n199a @  30.5.2013,  17:07 Найти цитируемый пост)
Как получилось это:

Это значения перемененных по мере выполнения цикла. И они явно указывают на ложность вашего утверждения о том, что 
Цитата(n199a @  30.5.2013,  17:07 Найти цитируемый пост)
Получается, что в независимости от того, чему будет сначала равна переменная x, в итоге получим x = 1.


Цитата(n199a @  30.5.2013,  17:07 Найти цитируемый пост)
Зачем в этом случае писать x = a, если это и так будет понятно? Вот в таком контексте стоит рассматривать мой пример.

Да потому что на второй итерации f2 уже не будет нолем.
Вы вообще понимаете, что там цикл? И это не рекурсия, нету никакого "возвращает 3 раза".
Код
int i, f1 = 1, f2 = 0, x;
for (i = 2; i <= n; i ++) {
x = f1 + f2; // следующее число
f2 = f1; f1 = x; // сдвиг значений
}
Цитата

первая итерация: 
f1 == 1, f2 == 0, x is undefined;
x = 1 + 0 = 1;
f2 = 1;
f1 = 1;

вторая итерация:
f1 == 1, f2 == 1, x == 1;
x = 1 + 1 = 2;
f2 = 1;
f1 = 2;

третья итерация:
f1 == 2, f2 == 1, x == 2;
x = 1 + 2 = 3;
f2 = 2;
f1 = 3;


Цитата(n199a @  30.5.2013,  17:07 Найти цитируемый пост)
Зачем в этом случае писать x = a, если это и так будет понятно?

Потому что это про-гра-мми-ро-ва-ни-е... 
Делать отдельный блок кода на случай, если b = 0 это тупо. Код в цикле делают таким, чтобы он на любой итерации правильно работал.

Это сообщение отредактировал(а) Arantir - 30.5.2013, 18:45


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
feodorv
Дата 30.5.2013, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(n199a @  30.5.2013,  19:07 Найти цитируемый пост)
Получается, что в независимости от того, чему будет сначала равна переменная x, в итоге получим x = 1. Т.е. только единица будет возвращаться в Fib2

Нет, не получается smile 


Цитата(n199a @  30.5.2013,  19:07 Найти цитируемый пост)
Как получилось это

Получилось как раз в ходе выполнения цикла. Как видите, x не равно 1.


Цитата(n199a @  30.5.2013,  19:07 Найти цитируемый пост)
Акцент делается на слово тогда

Гм. Просмотрел Ваши ранние сообщения, слово "тогда" не обнаружено...


Цитата(n199a @  30.5.2013,  19:07 Найти цитируемый пост)
Я ещё не учил про то, как используется <<

А printf Вам знаком? Можно и через printf переписать...


Цитата(n199a @  30.5.2013,  19:07 Найти цитируемый пост)
Вы не так поняли то, что я писал.

Сожалею, что не правильно Вас понял. Сожалею, что не могу понять Вас правильно smile 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
baldina
Дата 31.5.2013, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



хотел написать пару слов, но почитав как объяснения умельцев объяснений разбились о стену непонимания результата трех присваиваний...
пока понаблюдаю матч с трибуны)))

Добавлено через 7 минут и 32 секунды
не, скучно в зрителях  smile 

n199a, составьте таблицу значений переменных в конце каждого шага цикла, вручную вычисляя значения
я начну, вы продолжайте

начальные значения
f1=1
f2=0
x=?

 i    x    f2   f1
-------------------
2    1    1   1

когда составите (и тут же, думаю, все поймете), посмотрите что писал вам в самом начале Arantir
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0812 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.