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


Автор: danilkramatorsk 28.4.2013, 13:40
объясните пожалуйста, как работает здесь рекурсия 
Код
#include <iostream>
using namespace std;

void someFunction ( int [], int, int );

int main ()
{
 const int arraySize = 10;
 int a[arraySize] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
 int poisk;
 cin >> poisk;
 cout << "The values in the array are:" << endl;
 someFunction( a, poisk, arraySize );
 cout << endl;
 
 system ("Pause void");
 return 0;
     
}

void someFunction ( int b[], int current, int size )
{
        if ( current < size )
        {  
        someFunction ( b, current + 1, size ); /
        cout << b[ current ] << " " << endl;
        } 
}


current +1 для чего, почему при выводе на экран ( poisk = 0 ) выводится массив в обратном порядке
ведь при ( poisk = 0 ) current = 1 b[ 1 ]= 2;
спасибо 

Модератор: не забываем пользоваться кнопочкой "Код"

Автор: NightmareZ 28.4.2013, 13:54
Цитата(danilkramatorsk @  28.4.2013,  12:40 Найти цитируемый пост)
current +1 для чего

Для того, чтобы увеличивать индекс текущего элемента на единицу.

Цитата(danilkramatorsk @  28.4.2013,  12:40 Найти цитируемый пост)
почему при выводе на экран ( poisk = 0 ) выводится массив в обратном порядкеведь при ( poisk = 0 ) current = 1 b[ 1 ]= 2;спасибо 

Потому что в функции someFunction происходит сначала рекурсивный вызов самой себя с индексом current+1, а уже потом вывод элемента с текущим индексом current.
Так дойдя до самого дна ( когда перестанет выполняться условие if ( current < size ) ), будет выполнен сначала вывод для current == size - 1, затем выход в функцию уровнем выше, вывод для current == size - 2 и т.д. вплоть до current == poisk.

Автор: danilkramatorsk 28.4.2013, 14:16
NightmareZ, 
Цитата(NightmareZ @  28.4.2013,  13:54 Найти цитируемый пост)
Так дойдя до самого дна ( когда перестанет выполняться условие if ( current < size ) ), будет выполнен сначала вывод для 
Цитата

current == size - 1
, затем выход в функцию уровнем выше, вывод для current == size - 2 и т.д. вплоть до current == poisk.

то есть будет действовать так poisk = 0;
current = 1; потом = 2, 3 и.т.д
Но все равно не понял откуда появляется обратный порядок... 
откуда current = 1; потом = 2, 3 и.т.дcurrent = 1; потом = 2, 3 и.т.д
Но все равно не понял откуда появляется обратный порядок... Но все равно не понял откуда появляется обратный порядок... 
откуда 
Цитата

current == size - 1

если у меня его нет. Видимо не понял как именно работает, если можно более подробно 
что является первым шагом вторым...

спасибо)

Автор: baldina 28.4.2013, 18:45
Цитата(danilkramatorsk @  28.4.2013,  13:40 Найти цитируемый пост)
void someFunction ( int b[], int current, int size )
{
        if ( current < size )
        {  
        someFunction ( b, current + 1, size ); /
        cout << b[ current ] << " " << endl;
        } 
}

попробуй так:
Код
void someFunction ( int b[], int current, int size )
{
    if ( current < size )
    {  
      cout << b[ current ] << " " << endl;
      someFunction ( b, current + 1, size ); /
    } 
}


Добавлено через 7 минут и 46 секунд
вот смотри, такой вызов: someFunction (b, 0, 3) приводит к такой последовательности 

Код

someFunction (b, 0, 3)
  0 < 3
     someFunction (b, 1, 3)
        1 < 3
           someFunction (b, 2, 3)
              2 < 3
                 someFunction (b, 3, 3)
                    3 < 3 // ложь
                    return
                 cout << b[2]
              return
           cout << b[1]
        return
     cout << b[0]
  return

Автор: danilkramatorsk 28.4.2013, 20:20
baldina, отлично, понял! Спасибо большое!

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