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

Ребята, объясните пожалуйста эту рекурсию! - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Ввести координаты вершин треугольника. Проверить, является ли он равнобедренным http://www.cyberforum.ru/cpp-beginners/thread51535.html
1 Ввести координаты вершин треугольника. Проверить, является ли он равнобедренный. 2 Ввести координаты двух точек. Найти место пересечения координатной оси X и прямой, проходящей через эти точки. за помощь буду очень благодарен.желательно написать в Visual studio 6.0
C++ fseek вылетает #include <stdio.h> #include <windows.h> char *filename; long size; File *in; char *infile; int main(int argc, char *argv) { filename = "file.bin"; try http://www.cyberforum.ru/cpp-beginners/thread51521.html
Код Хэмминга C++
Прошу объяснить как работает этот код Хэмминга и написать прогу по заданию. Задание. 1)Написать программу, реализующую код Хэмминга для текстового файла. Блок для кодирования взять произвольный. 2)Выполнить проверку работы алгоритма, то есть изменить текстовый файл, а ваша программа должна определить и справить ошибку. 3)Протокол работы программы должен выводиться на экран.
C++ Текстовый редактор - программа выдает предупреждения
Тут вот задали написать текстовой редактор на си,выдана программа-заготовка,она по идее якобы тот же текст.ред.но урезанный,в общем беру эту прогу,пытаюсь компилировать,но -куча ошибок(чего в принципе быть не должно), начинаю смотреть вид ошибок,понимаю что не подключены нек.библиотеки #include,кое-что узнаю,вношу,но остается все таки еще- c:14: предупреждение: инициализация из...
C++ Запись файла в изображение http://www.cyberforum.ru/cpp-beginners/thread51449.html
Программа для записи файла в bitmap, с хидером. #include <stdio.h> #include <conio.h> char *filename, *picname; FILE *in, *out; char *infile; long size; char *hdr; int wh; struct{
C++ даны натуральные числа N и M (N>M). вычислить : N --- \ K(квадрат) ln(K!) / --- K=M даны натуральные числа N и M (N>M). вычислить : подробнее

Показать сообщение отдельно
just_a_cat
5 / 5 / 1
Регистрация: 16.09.2009
Сообщений: 4
20.09.2009, 23:30     Ребята, объясните пожалуйста эту рекурсию!
ты не понимаешь рекурсию вообщем ? или только рекурсию в данной задаче ?
если вообщем, то лучше изучать её на примере вычисления факториала :
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int fact(int N) 
{
           int Res;
    if (N > 1) {
        Res= fact(N-1)*N;
    }
    else {
        Res = 1;
    }
 
    return Res;
}
int main()
{
           cout << factorial(3);
 
           system("pause > nul");
           return 0;
}
для начала попробуем разбить нашу задачу вычисления факториала, на простые подзадачи
C
1
2
//N! = N*(N-1)*(N-2)*...*2*1 = (N-1)!*N
    //(N-1)! = (N-1)*(N-2)*...*2*1
тоесть нам нужно умножить н-1, потом н-1-1, потом н-1-1-1... и так пока н-1 не будет равно 1.
это мы и делаем вот в этой строке,

C
1
Res= fact(N-1)*N;
тоесть мы умножаем результат нашеё функции, на N, чему равен результат функции ? верно, мы не знаем, но мы можем пойти дальше, а потом вернуться.

C
1
Res= fact(N-1)*N;
компилятор смотрит на эту строку и что он делает ? он обращается к функции, только N делает на еденицу меньше, чему бы не было равно N, мы когда нибудь дойдём и оно будет равно еденице. И только когда оно будет равно еденице мы начнём возвращататься на те места с которых мы ушли, то есть мы начнём возвращать наш результат res, и куда же он вернётся ?
ну конечно же туда где мы его последний раз вызывали тоесть в нашу формулу
[C]Res= fact(N-1)*N;[/С]
потом мы снова отрезультируем (вернём результат) и снова вернёмся к формуле, то есть код будет считываться примерно вот так вот


C
1
2
3
4
5
 int fact(int N) 
{
           int Res;
    if (N > 1) {
        Res= fact(N-1)*N;
// fact (N-1) снова вызывает функцию, тоесть
C
1
2
3
4
5
int fact(int N) 
{
           int Res;
    if (N > 1) {
        Res= fact(N-1)*N;
// и так пока N будет больше 1
...................
C
1
2
3
4
5
6
7
8
9
10
11
int fact(int N) 
{
           int Res;
    if (N > 1) { // когда же мы наконец-то сравняем N с 1, то 
        Res= fact(N-1)*N; 
           }    
            else {
        Res = 1;     // мы наконец-то прийдём в эту точку, тоесть присвоем переменной res eдиницу
    }
 
    return Res; //   и вернём её
// а возвращать будем, туда откуда вызывали, тоесть вот сюда:

C
1
2
3
4
5
6
7
    Res= fact(N-1)*N; // только место  fact(N-1) будет наш Res
           }    
            else {                 
        Res = 1;   // сюда мы даже заходить не будем
    }
 
    return Res;  // а сразу пойдём сюда
// и так далее :

C
1
2
3
4
5
6
7
     Res= fact(N-1)*N; 
           }    
            else {                 
        Res = 1;   
    }
 
    return Res;
// пока не вернёмся в самое самое начало, к самому первому вызову.
C
1
2
3
4
5
6
7
 Res= fact(N-1)*N; 
           }    
            else {                 
        Res = 1;   
    }
 
    return Res;
// теперь мы уже будем возвращать рес не в функцию факт, а в инт меин () ...


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