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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Рекурсия 
V
    Опции темы
necrom
Дата 22.8.2011, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Подскажите пожалуйста почему ответ 26 в этой рекурсивной функции.
Код

#include <iostream>
#include <string>
#include "math.h"

using namespace std;
int foo(int n)
{
if (n <= 0){
    cout << "Return" << endl;
    return 1;
}

    cout << n << " ";
    return foo(n - 1) + foo(n / 2);
}
void main()
{
    cout << "Result: " << foo(7) << endl;
}

Разложил на листе данную рекурсию, получилось следующее.
Цитата

    13                 10    3                  3
foo(7) <- foo(6)+foo(3) <- foo(2)+foo(1)
              10 /                       2/         \1
    foo(5)+foo(3)    foo(1)+foo(1)    foo(1)
     7/                   \3    
     foo(4)+foo(2)   foo(2)+foo(1)
  5/              \2          \2
    /               \       foo(1)+foo(1)
    /                 \    
foo(3)+foo(2)    foo(1)+foo(1)
     /            \
    /               \
  3/               2\
foo(2)+foo(1) foo(1)+foo(1)
2/
foo(1)+foo(1)


Это сообщение отредактировал(а) necrom - 22.8.2011, 18:48
PM MAIL   Вверх
hils
Дата 22.8.2011, 19:53 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Смотри, тут все просто:

1. для начала рассмотри базис простейших вариантов функции, а именно:

foo(1) выдаст результат 2.
foo(2) выдаст результат 4.
foo(3) -> return foo(2)+foo(1) (а это ничто иное как 2+4=6)
....
и т.д.
Я надеюсь тебе это понятно и не вызывает вопросов.

2. Далее так как рекурсия это у нас непростая система, то ее лучше приставлять всегда в виде простейших, а именно:

foo(7) -> return foo(6)+foo(3).


foo(3) даст нам результат 6(см. выше)

А вот foo(6) стоит рассмотреть подробнее.

3. foo(6) -> foo(5) + foo(3) -> foo(4)+foo(2) + 6 -> foo(3)+foo(2) + 4 + 6 -> 6 + 4 + 4 + 6 = 20.

4. А теперь объеденим пункты 3 и 2 .... соответственно результатом будет 6 + 20 = 26! 




PM MAIL   Вверх
necrom
Дата 22.8.2011, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всё понял спасибо  smile . Не увидел знак (n <= 0) думал, что foo(1) - это 1.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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