Форум русскоязычного сообщества Ubuntu


Автор Тема: Обясните плиз рекурсию)  (Прочитано 2742 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн PinFl0p1

  • Автор темы
  • Новичок
  • *
  • Сообщений: 33
    • Просмотр профиля
Обясните плиз рекурсию)
« : 23 Декабрь 2008, 01:40:50 »
Уже часа 1.5 сижу над рекурсией понять не могу как она возвращает..сам принцип понимаю, а вот как возвращает..обьясните по русски плиз)
//chislo-число вводимое в степень,stepen- степень..
int VvodVStepen (int chislo, int stepen)
{
if (stepen == 1)
//если степень равняется единице..
{return chislo;}
//то возвращается номинальное число
else
//если нет
return (chislo * VvodVStepen (chislo, stepen-1)); //Вот тут то я и застрял ..
}

например число равно 2 степень равна 3 по идее должно возвратится 16.
Мой мозг думает так: 1)2 в степени 2(почему в степени 2? потому что stepen - 1 тоесть степень 3 - 1...)   получается 4
                                         2)4 в степени  2-1 значит 4 в степени 1 получается ответ 4..но никак не 16...
Обьясните плиз в чем мой мозг не прав.. :)

P.s пока писал походу дела понял...первый раз из степени не вычитается единица ...правильно понял?) ???
p.s(2) спс изменил..
« Последнее редактирование: 23 Декабрь 2008, 02:46:13 от PinFl0p1 »
__Чем меньше девушек мы любим - тем больше нравимся мы им.__
__Кризис – это актуализация экзистенциальности__

Оффлайн unimix

  • Активист
  • *
  • Сообщений: 537
    • Просмотр профиля
Re: Обясните плиз рекурсию)
« Ответ #1 : 23 Декабрь 2008, 02:25:40 »
Для начала замени
return (chislo * VvodVStepen (stepen-1,chislo));на
return (chislo * VvodVStepen (chislo, stepen-1));   


Оффлайн AyaTooru

  • Активист
  • *
  • Сообщений: 257
    • Просмотр профиля
    • http://ayatooru.com
Re: Обясните плиз рекурсию)
« Ответ #2 : 23 Декабрь 2008, 02:50:00 »
ну всё правильно, в первом случае у тебя получилось, что переменная chislo вычислилась и стала равна 2^(3-1)=4, а во втором: chislo*2^(2-1)=4*4=16

Оффлайн SKBuggly

  • Новичок
  • *
  • Сообщений: 20
    • Просмотр профиля
Re: Обясните плиз рекурсию)
« Ответ #3 : 23 Декабрь 2008, 09:17:30 »
вообще-то ответ 8, а не 16...........2 в степени 3 ведь 8, так оно и получается

Сначала функция  вызывается с параметрами (2,3)
далее проверка степень(3) равно 1........нет...........тогда возвращется число(2) * на ту же функцию, но с параметрами(2,2), 3 -1 ведь 2?
на этой второй итерации опять проверка 2 не равно 1, тогда возврат 2 * функция (2,1),
на третей итерации проверка , на этот раз 1 = 1, тогда возврат просто числа 2, которое во второй итерации умножено на 2, что дает 4 и в первой итерации тоже умножается на 2 и в результате 8
« Последнее редактирование: 23 Декабрь 2008, 10:05:21 от SKBuggly »

Оффлайн PinFl0p1

  • Автор темы
  • Новичок
  • *
  • Сообщений: 33
    • Просмотр профиля
Re: Обясните плиз рекурсию)
« Ответ #4 : 23 Декабрь 2008, 10:19:17 »
вообще-то ответ 8, а не 16...........2 в степени 3 ведь 8, так оно и получается
Во сумашествие :2funny: не думал что настолько школу забыл))почему то думалось что 2*2=4 и 4 во второй степени 4*4=16...

я окончательно запутался :D
Значит VvodVStepen (chislo, stepen-1) степень начинает  вычитаться  при первом ,  а не при втором вызове так?(если да то я всё понял, а если нет то еще сильнее запутался)
...
все понял
почти так как в первом посте только не додумался о третьей итерации..

Всем Спасибо!)Всё понял. :angel:
« Последнее редактирование: 23 Декабрь 2008, 10:28:04 от PinFl0p1 »
__Чем меньше девушек мы любим - тем больше нравимся мы им.__
__Кризис – это актуализация экзистенциальности__

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Обясните плиз рекурсию)
« Ответ #5 : 23 Декабрь 2008, 12:14:25 »
преподы с дуба рухнули степень сичла рукурсией вычислять... просто клиника.
деревья рекурсией обходятся... потренируйся на каталогах, это на много понятнее.

Оффлайн PinFl0p1

  • Автор темы
  • Новичок
  • *
  • Сообщений: 33
    • Просмотр профиля
Re: Обясните плиз рекурсию)
« Ответ #6 : 23 Декабрь 2008, 20:32:08 »
преподы с дуба рухнули степень сичла рукурсией вычислять... просто клиника.
деревья рекурсией обходятся... потренируйся на каталогах, это на много понятнее.
Спс,это не преподы это Джесс Либерти, Бредли Джонс "Освой с++ за 21 день"
__Чем меньше девушек мы любим - тем больше нравимся мы им.__
__Кризис – это актуализация экзистенциальности__

Оффлайн Alsvartr

  • Активист
  • *
  • Сообщений: 779
  • The secret of the secret
    • Просмотр профиля
Re: Обясните плиз рекурсию)
« Ответ #7 : 23 Декабрь 2008, 20:52:44 »
Чтобы понять рекурсию, надо сперва понять рекурсию :)

Оффлайн Lonely_@ss

  • Новичок
  • *
  • Сообщений: 27
    • Просмотр профиля
Re: Обясните плиз рекурсию)
« Ответ #8 : 24 Декабрь 2008, 01:51:26 »
Если рассматривать последовательность выполнения кода, то первым полностью выполненым ретурном будет return 1, тобишь дно рекурсии.

Думаю, есть смысл перенести в Юмор...

PS: "Салат "Рекурсивный" : помидоры, огурцы, салат." (с) старый бор-баян.
« Последнее редактирование: 24 Декабрь 2008, 01:55:22 от Lonely_@ss »

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Обясните плиз рекурсию)
« Ответ #9 : 24 Декабрь 2008, 06:05:12 »
PinFl0p1, пипец... я всегда знал что книжки типа "освой термоядерный синтез за 21 день" ни к чему хорошему не приводят. Выкини нахрен эту лажу. Читай нормальные книжки. Синтаксис и почему сделано именно так - чиатй Страуструпа. Остальное тебе дадут книги:
Скотт Мейерс - Эффективное использование C++
Скотт Мейерс - Эффективное использование STL
Джефф Элджер - C++ Библиотека программиста
Николай Джосьютис - C++ Стандартная библиотека
Скотт Мейерс - Наиболее эффективное использование C++

P.S. ммм... ну да... там правда не объясняется рекурсия. для понимания базовых вещей лучше читать Вирта. хоть и на паскаль-подобном псевдо-языке но объясняет он хорошо.
« Последнее редактирование: 24 Декабрь 2008, 06:07:59 от Yurror »

Оффлайн PinFl0p1

  • Автор темы
  • Новичок
  • *
  • Сообщений: 33
    • Просмотр профиля
Re: Обясните плиз рекурсию)
« Ответ #10 : 26 Декабрь 2008, 03:47:11 »
Спасибо,книжки скачал,создал так сказать библиотеку у себя на компе по с++,на каждой теме в какой книге понятнее там и читаю)с рекурсией разобрался))
читаю про классы уяснил практически на 90%
но при компилировании выскакивает ошибка:   34: ошибка: expected primary-expression before ‘int’
Никак не пойму что добавить перед инт, подскажите пожалуйста если не затруднит(мне уж как то стыдно :-[  задавать тут вопросы про программирование,т.к. форум об Ubuntu :D), уверен что чтото простое)
#include <iostream>
using namespace std;

class Cat
{
public:
int Getage();
int Setage(int now,int last);
void meow();
private:
int itsage;
};
int Cat::Getage()
{
return itsage;
}
int Cat::Setage(int now,int last)
{
cout<<"Введите возраст кошки";
cin>>last;
now=last;
itsage=now;
return (now);
}
void Cat::meow()
{
cout<<"мяу\n";
}

int main()
{

Cat Frisky;
Frisky.Setage(int now,int last); //34 строка :)
Frisky.meow();
cout <<"Фриски это кошка которой "<<Frisky.Getage()<<" лет!";
Frisky.meow();
return 0;
}



__Чем меньше девушек мы любим - тем больше нравимся мы им.__
__Кризис – это актуализация экзистенциальности__

Оффлайн SKBuggly

  • Новичок
  • *
  • Сообщений: 20
    • Просмотр профиля
Re: Обясните плиз рекурсию)
« Ответ #11 : 26 Декабрь 2008, 05:25:28 »
в этой строке в функцию передаются параметры now и last, которые ранее не были объявлены

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Обясните плиз рекурсию)
« Ответ #12 : 26 Декабрь 2008, 08:45:50 »
PinFl0p1, мдя... синтаксис тебе еще долго учить.
Ты этим кодом что хотел сказать?
Я даже не рискну делать каких то предположений, лучше отсыпь той травы что ты курил когда писал это.

Код: Text
  1. #include <iostream>
  2.  
  3. class Cat {
  4.    int itage;
  5. public:
  6.    void setAge(int age);
  7.    int getAge();
  8.  
  9.    void meow();
  10. };
  11.  
  12. void Cat::setAge(int age) {
  13.    itage = age;
  14. }
  15.  
  16. int Cat::getAge() {
  17.    return itage;
  18. }
  19.  
  20. void Cat::meow() {
  21.         std::cout << "мяу";
  22. }
  23.  
  24. int main() {
  25.    int tmp_age;
  26.    Cat Frisky;
  27.    std::cout << "Введите возраст кошака: ";
  28.    std::cin >> tmp_age;
  29.    Frisky.setAge(tmp_age);
  30.    std::cout << "Возраст кошака " << Frisky.getAge() << std::endl;
  31.    std::cout << "Кошка говорит \"";
  32.    Frisky.meow();
  33.    std::cout << "\"" << std::endl;
  34.    return 0;
  35. }
  36.  

yurik@ubuntu:~$ g++ cat.cc -o cat
yurik@ubuntu:~$ ./cat
Введите возраст кошака: 300
Возраст кошака 300
Кошка говорит "мяу"
yurik@ubuntu:~$

Оффлайн unimix

  • Активист
  • *
  • Сообщений: 537
    • Просмотр профиля
Re: Обясните плиз рекурсию)
« Ответ #13 : 26 Декабрь 2008, 09:37:00 »
Ты этим кодом что хотел сказать?
Я даже не рискну делать каких то предположений, лучше отсыпь той травы что ты курил когда писал это.
yurik@ubuntu:~$ g++ cat.cc -o cat
yurik@ubuntu:~$ ./cat
Введите возраст кошака: 300
Возраст кошака 300
Кошка говорит "мяу"
yurik@ubuntu:~$

Прога для поднятия настроения  :D Филосовский вопрос: сколько кошке лет ни даш - она все равно ответит "мяу"...

int Cat::Setage(int now,int last)
{
cout<<"Введите возраст кошки";
cin>>last;
now=last;
itsage=now;
return (now);
}

Здесь в функции объявляются входящие аргументы. Зачем, если внутри функции они переопределяются и входящие данные нигде не используются?

В данном случае правильней было бы:
int Cat::Setage()
{
int now;
int last;
...
}
« Последнее редактирование: 26 Декабрь 2008, 09:50:16 от unimix »

Оффлайн PinFl0p1

  • Автор темы
  • Новичок
  • *
  • Сообщений: 33
    • Просмотр профиля
Re: Обясните плиз рекурсию)
« Ответ #14 : 26 Декабрь 2008, 11:48:04 »
PinFl0p1, мдя... синтаксис тебе еще долго учить.
Ты этим кодом что хотел сказать?
Я даже не рискну делать каких то предположений, лучше отсыпь той травы что ты курил когда писал это.
ну эт в листинге так на тему "реализация методов класса"))))))))) ;D
только там :
...
void Cat::Setage(int age)
{
itsage = age;
}
int main()
{
Cat.Frisky;
Frisky.Setage[5]
Frisky.meow();
cout << "Frisky is a cat who is ";
cout << Frisky.Getage() << " years old.\n";
Frisky.meow();
return 0;
}
но я решил извратится и давать возраст самому... :D


Цитировать
Здесь в функции объявляются входящие аргументы. Зачем, если внутри функции они переопределяются и входящие данные нигде не используются?
В данном случае правильней было бы:
int Cat::Setage()
{
int now;
int last;
...
}

честно говоря насчет этого долго мозговал))
« Последнее редактирование: 26 Декабрь 2008, 12:13:50 от PinFl0p1 »
__Чем меньше девушек мы любим - тем больше нравимся мы им.__
__Кризис – это актуализация экзистенциальности__

 

Страница сгенерирована за 0.072 секунд. Запросов: 24.