Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Рекурсия


Автор: XenOS12 29.8.2009, 20:59
Можете на данном примере объяснить, как работает рекурсия?

Код

#include <iostream>
using namespace std;
 
unsigned long fibonacci(unsigned long);

int main()
{
    unsigned long result, number;
    cout << "Enter cifra: ";
    cin >> number;
    result=fibonacci(number);
    cout << "Febona4a ("<< number <<") = " << result << endl;
    return 0;
}

unsigned long fibonacci(unsigned long n)
{
    if(n<3)
        return 1;
    else 
        return fibonacci(n-2) + fibonacci(n-1);
}

Автор: NightmareZ 29.8.2009, 21:11
Цитата(XenOS12 @  29.8.2009,  20:59 Найти цитируемый пост)
Можете на данном примере объяснить, как работает рекурсия?

Для того, чтобы понять рекурсию, нужно сначала понять рекурсию.

Автор: azesmcar 29.8.2009, 21:13
Цитата(XenOS12 @  29.8.2009,  20:59 Найти цитируемый пост)
Можете на данном примере объяснить, как работает рекурсия?

А в книже, из которой ты это переписал ничего не объяснено?

Автор: XenOS12 29.8.2009, 21:17
Ну там написано, типо это рекурсия, но как она работает - ни слова...

Автор: zim22 29.8.2009, 21:23
Цитата(XenOS12 @  29.8.2009,  20:59 Найти цитируемый пост)
Можете на данном примере объяснить, как работает рекурсия?

пользуйся поиском по форуму
http://forum.vingrad.ru/forum/topic-263727/kw-рекурсия-разбор.html

Автор: XenOS12 29.8.2009, 21:53
Всё равно не понимаю smile Вот я хочу, чтобы при вводе числа, например, "12" выводились числа каждый раз на одно меньше "11, 10, 9, 8..." Как это сделать? Покажите пожалуйста.

Код

#include <iostream>
using namespace std;
 
unsigned long bred(unsigned long);

int main()
{
    unsigned long result, number;
    cout << "Enter cifra: ";
    cin >> number;
    result=bred(number);
    return 0;
}

unsigned long bred(unsigned long n)
{
    if(n<=1)
        return 0;
    else 
        cout << n-1 << endl;
        return (n-1);
}



Автор: IKM2007 29.8.2009, 21:56
Код

#include <iostream>
void f(int x)
{
if(!x)
return;
std::cout<<x<<std::endl;
f(x - 1);
}
void main()
{
f(12);
}


Добавлено @ 22:03
XenOS12, во первых почему твоя функция возвращает unsigned long? ведь возвращенное значение ты нигде не используешь(пока не мере нет надобности).

И в коде 
Код

unsigned long bred(unsigned long n)
{
    if(n<=1)
        return 0;
    else //здесь незачем писать else
        cout << n-1 << endl;
        return (n-1);

}


вместо return (n - 1) пиши bred(n-1). Принцип рекурсии многократный вызов функции, но чтобы вызовы не были бесконечными, надо выбрать "базу", здесь "база" числа меньше или равные одному:
Код

f(n<=1)
        return 0;


то есть при каждом вызове параметр функции становиться меньше на один, и в итоге он равняется одному и работает оператор return 0.

Автор: XenOS12 29.8.2009, 22:18
Ещё раз извиняюсь, но что значит это:

Код

if(!x)
return;


и я читал, что функцию main лучше делать с типом возврата int...

Автор: IKM2007 29.8.2009, 22:23
Цитата(XenOS12 @  29.8.2009,  22:18 Найти цитируемый пост)
if(!x)return;

тоже самое, что и
Код

if(x == 0)
return;



Цитата(XenOS12 @  29.8.2009,  22:18 Найти цитируемый пост)
и я читал, что функцию main лучше делать с типом возврата int...

Да, правильно, так программа более переносимая становиться. Это только у меня такая привичка писать void.  smile 

Автор: XenOS12 29.8.2009, 22:25
IKM2007, ооо, спасибо большое, объяснил так, что я понял smile

Автор: IKM2007 29.8.2009, 22:32
Тогда ставь тему решенной, в правом верхнем углу.

Автор: XenOS12 29.8.2009, 22:34
Готово))))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)