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

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

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

Объясните работу рекурсивной функции из книги Г. Шилдта - C++

23.08.2015, 16:12. Просмотров 663. Ответов 24
Метки нет (Все метки)

Здравствуйте.Вопрос такой ,самостоятельно изучаю с++ по книге Герберта Шилда,дошел до темы рекурсия ,в книге есть такой пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;
int fact(int n);
int main()
{
    cout<<"factorial="<<fact(4);//1
    system("pause");
    return 0;
}
int fact(int n)
{
    int ans;
    if(n==1) return 1;
    ans=fact(n-1)*n;
    return (ans);
}//Программа вычесляет факториал числа.Число передается в строку "//1"
Как я понял функция работает следующим образом:
принимаем числа 3 и 2 (fact(n-1) записывает их в стэк ,и возвращает значения в обратном порядке (2 и 3)
,все это по порядку перемножается на 4,и с помощью инструкции return (ans);выводится на экран.Правильно я понял?
Обьясните пожалуйста ,на человеческом языке как вообще работает эта функцияВсем спасибо за ответ!
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.08.2015, 16:12
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Объясните работу рекурсивной функции из книги Г. Шилдта (C++):

Почему не работает программа-пример для демонстрации работы функции strcmp (из книги Шилдта)? - C++
Здравствуйте, помогите пожалуйста разобраться, почему программа не выполняется как надо. Программа-пример, для демонстрации работы функции...

Пояснить работу рекурсивной функции - C++
Ребят, может кто-нибудь объяснить тугодуму принцип работы этой функции, потому что я что-то сам никак... double maxs(double* a, int n)...

Книги Г.Шилдта в каком порядке нужно или какие книги для изучения с++ - C++
Скажите в каком порядке надо читать книги Г.Шилдта для изучения с++ . Возможно сначала придется с учить , или как лучше ? Или подскажите...

Книги Шилдта - C++
Скажите пожалуйста в чем разница между двумя его книгами: -&quot;Самоучитель С++&quot; -&quot;С++. Базовый курс&quot; Желательно мнение читавших. А...

Книги Герберта Шилдта - C++
Здравствуйте! Закончил 1 курс, по программированию на С++ остановились на классах, наследовании и пр. для дальнейшего изучения языка хочу...

Объясните работу функции - C++
Объясните некоторые моменты из программы. Функция ReplaceKey заменяет ключ отображения map Что такое value_type(newKey,...

24
MayaNash
1285 / 453 / 47
Регистрация: 24.08.2011
Сообщений: 2,214
23.08.2015, 16:24 #2
foxsc, вызывается факториал от 4. 4 != 1, так что вызывается факториал от 3, из него вызывается факториал от 2, из него (от 2) вызывается факториал от 1, и на этом рекурсия заканчивается. Факториал от 1 возвращает через стек значение 1, эта 1-ца из стека умножается на 2, и возвращается через стек в факториал от 3, в нем умножается на 3 и 6-ка возвращается в факториал от 4, в нем умножается на 4 и 24 возвращается в main
1
Sn1p3rOk
281 / 168 / 66
Регистрация: 19.04.2014
Сообщений: 1,096
Завершенные тесты: 2
23.08.2015, 16:26 #3
Цитата Сообщение от foxsc Посмотреть сообщение
Правильно я понял?
Нет. Вам стоит просто ознакомится как вычислят факториал математически и сразу все станет ясно.
Рекурсия - это алгоритм которая вызывает сам себя (проще говоря)
C++
1
2
3
4
5
6
7
8
ans=fact(n-1)*n; // в этой строке кода функция fact вызывает саму себя только теперь уже n - 1
 
// то есть рекурсивный вызов будет работать так
ans=fact(4-1)*4 // первый вызов
ans=fact(3-1)*3 // второй вызов
ans=fact(2-1)*2 // третий вызов
 
// и так далее пока n не будет равен 1
0
TheThe
6 / 6 / 4
Регистрация: 26.06.2015
Сообщений: 82
23.08.2015, 17:02 #4
C++
1
int fact(int n)
- Это функция, которая возвращает результатом своей работы целое число (int).
n=5;
погружение в рекурсию
Первый вызов функции:
C++
1
2
3
4
5
6
7
int fact(5)
{
    int ans;
    if(5==1) return ans=1;
    ans+=fact(5-1)*5;
    return ans;
}
Второй вызов функции:
C++
1
2
3
4
5
6
7
int fact(4)     //fact(5-1) = fact(4)
{
int ans;
if(4==1) return ans=1;
ans+=fact(4-1)*4;
return ans;
}
Третий вызов функции:
C++
1
2
3
4
5
6
7
int fact(3)    // fact(4-1) = fact(3)
{
int ans;
if(3==1) return ans=1;
ans+=fact(3-1)*3;
return ans;
}
Четвертый вызов функции:
C++
1
2
3
4
5
6
7
int fact(2)   //fact(3-1) = fact(2)
{
int ans;
if(2==1) return ans=1;
ans+=fact(2-1)*2;
return ans;
}
Пятый вызов функции:
C++
1
2
3
4
5
6
7
int fact(1)   //fact(2-1) = fact(1)
{
int ans;
if(1==1) return ans=1;
ans+=fact(1-1)*1;   //сюда не заходим, т.к. 1==1 истина и мы переменной ans присваиваем единицу (ans=1);
return ans;
}
Это было погружение в рекурсию.
Теперь выходим из нее:

Т.к. функция
C++
1
int fact(int n)
Возвращает результатом своей работы целое число, и эта функция( в пятом вызове) вернет нам единицу и начинает выход из рекурсии.


выход из рекурсии
Теперь обратно:
Четвертый вызов функции:
C++
1
2
3
4
5
6
7
int fact(2)   //fact(3-1) = fact(2)
int ans;
{
if(2==1) return ans=1;
ans+=fact(2-1)*2;     // теперь пишем == ans+= 1 (fact(2-1) вернула нам 1) *2  будет ans=2; Эта функция вернет 2.
return ans;  //вот тут вместо ans можно написать 2.
}
Третий вызов функции:
C++
1
2
3
4
5
6
7
int fact(3)    // fact(4-1) = fact(3)
{
int ans;
if(3==1) return ans=1;
ans+=fact(3-1)*3;   // ans+= 2 (fact(3-1) (четвертый вызов) вернул нам 2) *3 будет ans= 6; Эта функция вернет 6.
return ans;  // тут вместо ans можно написать 6.
}
Второй вызов функции:
C++
1
2
3
4
5
6
7
int fact(4)     //fact(5-1) = fact(4)
{
int ans;
if(4==1) return ans=1;
ans+=fact(4-1)*4;   // ans+= 6(fact(4-1) (третий вызов) вернул нам 6) *4 будет ans= 24; Эта функция вернет 24.
return ans;  // тут вместо ans можно написать 24.
}
Первый вызов:

C++
1
2
3
4
5
6
7
int fact(5)
{
    int ans;
    if(5==1) return ans=1;
    ans+=fact(5-1)*5;  // ans+=24(fact(5-1) (четвертый вызов) вернул нам 24)* 5 будет ans=120; Это функция вернет 120
    return ans;  // тут вместо ans можно написать 120.
}
5! = 120.
0
Mr.X
Эксперт С++
3051 / 1696 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
23.08.2015, 17:26 #5
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от foxsc Посмотреть сообщение
C++
1
2
3
4
5
6
7
int fact(int n)
{
    int ans;
    if(n==1) return 1;
    ans=fact(n-1)*n;
    return (ans);
}
Блин, давненько я в Шилдта не заглядывал. До чего кодишко-то дебильный. При вводе нуля, между прочим, происходит переполнение стека.
А в темах о книгах его на полном серьезе как нормального рекомендуют.
1
MayaNash
23.08.2015, 17:29
  #6

Не по теме:

Цитата Сообщение от Mr.X Посмотреть сообщение
До чего кодишко-то дебильный
+...

0
foxsc
1 / 0 / 0
Регистрация: 30.06.2015
Сообщений: 41
23.08.2015, 17:37  [ТС] #7
а почему меняется переменная n?в выражении
ans=factr(n-1)*n//почему уменьшается последняя n
0
rep plz
Заблокирован
23.08.2015, 17:38 #8
foxsc, изучаю тоже самое, только по Дейтелам. у них все доступно разжевано, почитайте. если у одного автора вам непонятна какая-то тема, посмотрите как про тоже самое пишут другие.
я думаю эта картинка облегчит ваше понимание. тут показано развёртывание рекурсивной функции и свёртывание с возвращаемым значением. т.е. на решение каждой ступени, внутри одной функции вызывается точно такая же отдельная функция
1
Миниатюры
Объясните работу рекурсивной функции из книги Г. Шилдта  
rep plz
Заблокирован
23.08.2015, 17:39 #9
т.е. подсчёт происходит от обратного. умножая от наименьших чисел к наибольшим
0
foxsc
1 / 0 / 0
Регистрация: 30.06.2015
Сообщений: 41
23.08.2015, 17:41  [ТС] #10
а книга называется "Как программировать на с++?"
0
MayaNash
1285 / 453 / 47
Регистрация: 24.08.2011
Сообщений: 2,214
23.08.2015, 17:41 #11
foxsc, да
0
rep plz
Заблокирован
23.08.2015, 17:55 #12
можете мне не верить, но в русском варианте она называется "Как программировать па C++"
0
Миниатюры
Объясните работу рекурсивной функции из книги Г. Шилдта  
castaway
23.08.2015, 18:10
  #13

Не по теме:

Цитата Сообщение от rep plz Посмотреть сообщение
можете мне не верить, но в русском варианте она называется "Как программировать па C++"
Насчитал 8 синтаксических ошибок, при чём во всех случаях заместо буквы и написана п. Интересно было бы взглянуть текст в оригинале.

0
MayaNash
23.08.2015, 18:12
  #14

Не по теме:

castaway, скорее всего это автоматический распознаватель текста ("и" похожа в общем-то на "п", и на "н"), во многих книгах такое встречала

0
castaway
23.08.2015, 18:15     Объясните работу рекурсивной функции из книги Г. Шилдта
  #15

Не по теме:

Керра, я тоже об этом подумал, но формат DjVu использует изображения а не текст, следовательно сначала книгу "распознали" а потом ещё и сосканировали. Пользы и удовольствия от чтения такой книги мало

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.08.2015, 18:15
Привет! Вот еще темы с ответами:

Объясните работу функции fread() - C++
Возникла проблема при чтении файла по частям. Вообщем задача состоит в том что нужно считывать 64 байта с файла, записывать их в некий...

Кто читал книги Г. Шилдта, отзовитесь - C++
Вообщем случайно забрел в книжный и там купил &quot;Полный справочник по С++ Г. Шилдт&quot;. Пришел домой решил почитать мнения людей о этой книге, я...

Не работает программа из книги Герберта Шилдта. - C++
Подскажите и мне тоже из этой книги не работает программа. #include&lt;iostream&gt; #include&lt;cstdlib&gt; #include&lt;conio.h&gt; using namespace...

Не работает программа из книги Герберта Шилдта. - C++
При вводе кода из вышеупомянутой книги, выдает 3 ошибки: 1) error C2440: '=' : cannot convert from 'char ' to 'char' 2)error C2446:...


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

Или воспользуйтесь поиском по форуму:
15
23.08.2015, 18:15
Ответ Создать тему
Опции темы

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