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

"Рекурсивная функция" (Обход бинарного дерева) - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Расположить столбцы матрицы в соответствии с ростом характеристик http://www.cyberforum.ru/cpp-beginners/thread102248.html
"Характеристикой столбца целочисленной матрицы назовем сумму модулей его отрицательных нечетных элементов. Переставляя столбцы заданной матрицы, расположить их в соответствии с ростом характеристик" можете помочь с этим задачом?
C++ [Геометрия]Скалярное произведение векторов Добрый день. Есть вот такая задача: Даны векторы a и b Найти длины этих векторов, их скалярное произведение, а также косинус угла между ними. Предусмотреть возможность ввода данных пользователем, а также получение инструкций (справки) по использованию формул для вычислений. Я написал программу, но не уверен верно ли написал. #include <iostream.h> http://www.cyberforum.ru/cpp-beginners/thread102245.html
C++ Два потока в одной программе
Две фунцкии одной программы оформить как две функции потока. После ввода значений запускаются два требуемых потока, а потом на экран выводится полученные значения. Все функции я написал, работает программа. Не могу понять, как создать 2 потока через CreateThread, а закрыть его еще сложнее т-т Псевдокод: <ввод параметров> *создание потока* -работае кусок программы в потоке...
C++ Как умножить числа…
Доброй ночи Господа! Помогите мне как начинающему программисту умножить два крупных числа, очень надо, вот код (пример): #include "stdafx.h" // #include <iostream> #include <conio.h> #include <windows.h> #include <stdlib.h> #include <stdio.h>
C++ Методы реализации операций над текстом http://www.cyberforum.ru/cpp-beginners/thread102235.html
Не совсем понятны мне алгоритмы, как реализовать такие операции над текстом: Класс-контейнер, который является абстракцией текста и состоит из объектов класса-строки и методов добавления строки к тексту, удаление строки из текста, очистка текста, получения длины самой длинной строки, транслитерации текста, из кириллицы в латиницу, выведение текста
C++ Анимация контролов на winform Возник вопрос - а как под виндой писать анимацию для контроллов (кнопок, окон и прочего) Нормально? =) Вопрос собственно возник изза чего: В MacOSX привык к аниматору - допустим мне нужно, чтобы окно сжалось и куда-то уехало, притом плавно - всего одна строка кода - setFrame:myRect] (по памяти. Именно для окон строчка немного изменяется, этот код как-раз для кнопок и прочего внутри окна) и... подробнее

Показать сообщение отдельно
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
10.03.2010, 14:05     "Рекурсивная функция" (Обход бинарного дерева)
Вот думал думал, как автору пояснить что такое рекурсия, и сделал
функцию разворота массива: здесь явно показана работа со стеком,
пример факториала я посчитал, что лучше его не показывать.
//--------------------------------------------------------------------
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
//Пример рекурсивной функций, разворота массива: работа с аппаратным стеком. 
#include <iostream.h>
void reverse(int *mas,int val,int iter, int otcat_iter);
 
int main(){
 
const int SIZE = 10; 
 
int massive[SIZE] = {1,2,3,4,5,6,7,8,9,0};
 
reverse(massive,massive[0],1,SIZE-1);
 
for(int i=0;i<SIZE;i++)cout<<massive[i];
 
cout<<'\n';
return 0;
}
void reverse(int *mas, int val, int iter, int otcat_iter){
//Точка 1.  
    //----------------------------------------------------
    //Ветвь возрата завершает последнюю вызванную функцию,
    if(otcat_iter==0){
    mas[otcat_iter]=val;
    return;
    }
    //После этого действия: действия будут переходить в точку 2, 
    //----------------------------------------------------
 
reverse(mas, mas[0+iter],iter+1,otcat_iter-1);
 
//Точка 2.
//Это место: есть продолжение дейсвия каждой вызванной функцию,
//после возрата из очередной завершившейся функции.
mas[otcat_iter]=val;  /*этот код будет повторяться: пропорциоанльно количеству вызовов функций-1(одну), значения val и otcat_it
Будут меняться так как мы будет работать с параметрами разных функций.
Да и другие параметры будут меняться.
В эту точку передаётся управления как только очередная вызванная функция завершается.
  */
//-----------------------------------------------------------------------------------
}
Надеюсь мой труд не напрасен.

Добавлено через 28 минут
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
//Более подробное исследование рекурсии: сравнение с аналогом не рекурсией.
void f(int i){
if(i>=5)return;    
f(i+1);    
}
 
/*Поведение  рекурсивной функции  f, можно смоделировать с помощью нескольких функций, но реализация ограничена количеством функции, а рекурсия не зависит от количества функций
*/
void f1(int i);          //эта функция вызывается в main
void f2(int i);          //эта функция вызывается в f1           
void f3(int i);          //эта функция вызывается в f2
void f4(int i);          //эта функция вызывается в f3
void f5(int i);          //эта функция вызывается в f4
void f6(int i);          //эта функция вызывается в f5
//--------------------------------------------------------------------------------------------------------------------------
 
//эта функция вызывается в main
void f1(int i){
if(i>=5)return;
f2(i+1);            //вызываем f2
//После возврата из f2 управление попадёт сюда
 
}
//эта функция вызывается в f1
void f2(int i){
if(i>=5)return;
f3(i+1);            //вызываем f3
//После возврата из f3 управление попадёт сюда
}
//эта функция вызывается в f2
void f3(int i){
if(i>=5)return;
f4(i+1);            //вызываем f4
//После возврата из f4 управление попадёт сюда
}
//эта функция вызывается в f3
void f4(int i){
if(i>=5)return;
f5(i+1);            //вызываем f5
//После возврата из f5 управление попадёт сюда
}
//эта функция вызывается в f4
void f5(int i){
if(i>=5)return ;
f6(i+1);            //вызываем f6
//После возврата из f6 управление попадёт сюда
}
void f6(int i){
if(i>=5)return;
//Эта уже закон, если не указать return вызовы будут бесконечны(пока не переполнится стек), 
//но у нас не рекурсия.
 
}
int main(){
f1(0);
return 0;
}
Как смог так объяснил.
 
Текущее время: 10:31. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru