Форум программистов, компьютерный форум CyberForum.ru

Вопрос насчёт рекурсии в цикле - C++

Восстановить пароль Регистрация
 
Saf
0 / 0 / 0
Регистрация: 30.07.2010
Сообщений: 6
18.08.2010, 13:17     Вопрос насчёт рекурсии в цикле #1
Здравствуйте. У меня вопрос насчёт рекурсии в цикле. Вот пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int massiv[3]={1,2,3};
 
int heapPermute(int n){
cout <<"В начале n=" <<n <<' ';
int temp=0;
int razmer = sizeof(massiv)/sizeof(int);
if(n==0) { for(int i=0; i<razmer; i++) { if(i==0) {cout <<endl; }   cout <<massiv[i] <<' ';  } }
else {
    for(int i=0; i<n; i++){
        cout <<"В цикле n=" <<n <<" i="<<i <<endl;
        heapPermute(n-1);
        if(n%2!=0) { temp=massiv[0]; massiv[0]=massiv[n-1]; massiv[n-1]=temp; }
        else { temp=massiv[i]; massiv[i]=massiv[n-1]; massiv[n-1]=temp; }
                           }
     }
 
}
 
int main() {
 
heapPermute(3);
 
}
Непонятно следующее: откуда берутся значения n=2 после печати цифр 1,2,3. Я понимаю так - раз функция закончилась на 0, то она должна вернуться в предедущее состояние (n=1), что она,собственно и делает, но после появления того самого n=2.

P.S. Рекурсия аля числа Фибонначи рисую с помощью двоичного дерева. Функцию факториал - в виде прямой возвращающей число в предыдущий экран. Как можно зарисовать функцию из цикла? Помоги пожалуйста.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.08.2010, 13:17     Вопрос насчёт рекурсии в цикле
Посмотрите здесь:

C++ Насчёт функции memcpy()
C++ Насчёт каретки )
Вопросы насчёт быстрой сортировки C++
Подскажите насчёт random() C++
Вопрос по рекурсии C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
siger
13 / 13 / 1
Регистрация: 27.02.2010
Сообщений: 46
18.08.2010, 23:16     Вопрос насчёт рекурсии в цикле #2
Вот таже программа но с подправленым выводом.
Больше всего ине понравился конечный результат

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <iostream>
#include <cstdio>
using namespace std;
int massiv[3]={1,2,3};
 
int heapPermute(int n)
{
  cout <<"В начале n=" << n << endl;
  int temp=0;
  int razmer = sizeof(massiv)/sizeof(int);
  if(n==0) { 
    for(int i=0; i<razmer; i++) 
    { 
      if(i==0) 
      {
    cout <<endl;
      }
      cout <<massiv[i] <<' ';  
    }
    cout << " n=0";
    cout << endl;
      }
  else 
  {
    for(int i=0; i<n; i++)
    {
     
      heapPermute(n-1);
      if (n%2!=0)
      {
    temp=massiv[0]; 
    massiv[0]=massiv[n-1]; 
    massiv[n-1]=temp;
    cout <<"В цикле n=" <<n <<" i="<< i <<endl;
    cout << "Поменяли местами элементы " << 0 << " " << n-1 << endl;
    for(int j=0; j<razmer; j++) 
    { 
      cout <<massiv[j] <<' ';  
    }
    cout << endl;
    
      } 
      else 
      {
    temp=massiv[i]; 
    massiv[i]=massiv[n-1];
    massiv[n-1]=temp;
    cout <<"В цикле n=" <<n <<" i="<<i <<endl;
    cout << "Поменяли местами элементы " << i << " " << n-1 << endl;
    for(int j=0; j<razmer; j++) 
    { 
      cout <<massiv[j] <<' ';  
    }
    cout << endl;
    
      }
       //cout <<"В цикле n=" <<n <<" i="<<i <<endl;
    }
  }
}
 
int main() {
  
  heapPermute(3);
  cout << "После выполнения функции ";
  for(int j=0; j<3; j++) 
    { 
      cout <<massiv[j] <<' ';  
    }
    cout << endl;
  return 0;
 
}
Saf
0 / 0 / 0
Регистрация: 30.07.2010
Сообщений: 6
19.08.2010, 10:49  [ТС]     Вопрос насчёт рекурсии в цикле #3
Спасибо вам за пример. А теперь, собственно, вопрос к вам. Почему в первом проходе n вовзращается всего лишь до двойки, а в следующий раз проходит до тройки.
1 2 3
В нечётном цикле n=1 i=0
Поменяли местами элементы 0 0
1 2 3
В чётном цикле n=2 i=0
Поменяли местами элементы 0 1
3 2 1
ГДЕ n=3????
Если судить по дереву - 3-2-1-0. 0 вовращается к 1 и ,вроде, должен стать 2, а потом 3, но функция намного больше --> такой метод не подходит. Методом корней и листьев - 3-2-1-0. Лист 0(левый) вернулся к 1 и должен от 1 пойти в правый(0). Этого тоже не происходит.
siger
13 / 13 / 1
Регистрация: 27.02.2010
Сообщений: 46
19.08.2010, 18:02     Вопрос насчёт рекурсии в цикле #4
Как-то так:

http://xmages.net/show.php/1710621_2...56-34-jpg.html
Saf
0 / 0 / 0
Регистрация: 30.07.2010
Сообщений: 6
19.08.2010, 20:37  [ТС]     Вопрос насчёт рекурсии в цикле #5
Спасибо . Тему можно закрыть.
Yandex
Объявления
19.08.2010, 20:37     Вопрос насчёт рекурсии в цикле
Ответ Создать тему
Опции темы

Текущее время: 03:25. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru