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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Saf
0 / 0 / 0
Регистрация: 30.07.2010
Сообщений: 6
#1

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

18.08.2010, 13:17. Просмотров 568. Ответов 4
Метки нет (Все метки)

Здравствуйте. У меня вопрос насчёт рекурсии в цикле. Вот пример:
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. Рекурсия аля числа Фибонначи рисую с помощью двоичного дерева. Функцию факториал - в виде прямой возвращающей число в предыдущий экран. Как можно зарисовать функцию из цикла? Помоги пожалуйста.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.08.2010, 13:17
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вопрос насчёт рекурсии в цикле (C++):

Вопрос насчёт чтения файла - C++
Добрый вечер. у меня имеется файл, в котором данные расположены не в одной строке. Для чтения я использую функцию fgets, и вот такая...

Вопрос по рекурсии - C++
Здравствуйте. Обьясните новичку, почему если раскомментировать строчку (см. код программы) то программа будет выводить числа в обратном...

Вопрос по рекурсии - C++
Добрый вечер. В книжке С++ базовый курс Шилдта стр 175-176 есть пример Отображение строки в обратном порядке с помощью рекурсии (функция...

Насчёт каретки ) - C++
Всем привет )).Что бы я ни делал с кареткой,функции всегда возвращают нули =_=.Решил поэксперементировать с блокнотом: HWND f; ...

Насчёт функции memcpy() - C++
Начинаяю использовать эту функцию.Её синтаксис: void memcpy(void *to, const void *from, size_t count); Вопрос_1: Что такое...

Подскажите насчёт random() - C++
Люди добрые, подскажите, как можно сделать так, чтобы случайно выбиралось одно из заданных четырёх чисел? Если использовать random(num), то...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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;
 
}
2
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). Этого тоже не происходит.
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
1
Saf
0 / 0 / 0
Регистрация: 30.07.2010
Сообщений: 6
19.08.2010, 20:37  [ТС] #5
Спасибо . Тему можно закрыть.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.08.2010, 20:37
Привет! Вот еще темы с ответами:

Вопросы насчёт быстрой сортировки - C++
Здравствуйте. Объясните, пожалуйста. Есть алгоритм быстрой сортировки: Код: int shag=1; void quickSort(int arr, int left, int...

Насчёт шаблонного паттерна SingleTon - C++
Есть код паттерна template&lt;class T&gt; class Singleton { private: static T* ptr; protected: Singleton();

Пару вопросов насчёт ввода массива. - C++
в общем так: действия над матрицами задаю константы, например N=10, M=10, K=10, L=10 надо ввести два массива произвольного размера...

Насчёт числа знаков после запятой - C++
Вот например у меня массив с числами, у которых по 5 знаков после запятой. Как мне (с помощью какой функции или операции) сделать так чтобы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
19.08.2010, 20:37
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru