Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
foxsc
1 / 0 / 4
Регистрация: 30.06.2015
Сообщений: 46
#1

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

23.08.2015, 16:12. Просмотров 698. Ответов 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);выводится на экран.Правильно я понял?
Обьясните пожалуйста ,на человеческом языке как вообще работает эта функцияВсем спасибо за ответ!
http://www.cyberforum.ru/cpp-beginners/thread1908704.html
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.08.2015, 16:12
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Объясните работу рекурсивной функции из книги Г. Шилдта (C++):

Пояснить работу рекурсивной функции
Ребят, может кто-нибудь объяснить тугодуму принцип работы этой функции, потому...

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

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

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

Объясните работу функции
Объясните некоторые моменты из программы. Функция ReplaceKey заменяет ключ...

24
MayaNash
1291 / 459 / 151
Регистрация: 24.08.2011
Сообщений: 2,245
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 / 85
Регистрация: 19.04.2014
Сообщений: 1,098
Завершенные тесты: 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
Сообщений: 83
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
Эксперт С++
3178 / 1705 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
23.08.2015, 17:26 #5
Лучший ответ Сообщение было отмечено foxsc как решение

Решение

Цитата Сообщение от 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 / 4
Регистрация: 30.06.2015
Сообщений: 46
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 / 4
Регистрация: 30.06.2015
Сообщений: 46
23.08.2015, 17:41  [ТС] #10
а книга называется "Как программировать на с++?"
0
MayaNash
1291 / 459 / 151
Регистрация: 24.08.2011
Сообщений: 2,245
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
MayaNash
23.08.2015, 18:16
  #16

Не по теме:

castaway, скорее ее просто конвертировали в djvu, уж больно качественное изображение

0
castaway
23.08.2015, 18:23
  #17

Не по теме:

Керра, может и так, к счастью я не знаком с этой процедурой.

0
rep plz
23.08.2015, 20:26
  #18

Не по теме:

Цитата Сообщение от castaway Посмотреть сообщение
Пользы и удовольствия от чтения такой книги мало
зря вы так. у меня с десяток разных книг по С++ для новичков, и эта единственная, которая приносит и пользу и удовольствие. небольшие апшибки в тексте не страшны, смысл от этого не теряется. а в других книгах ошибок нет, но с нулевыми знаниями, смысл отдельных вещей приходится искать в других книгах

0
castaway
23.08.2015, 20:32
  #19

Не по теме:

rep plz, согласись, удовольствие от чтения бумажной литераторы без ошибок будет больше!

0
rep plz
23.08.2015, 21:47     Объясните работу рекурсивной функции из книги Г. Шилдта
  #20

Не по теме:

Цитата Сообщение от castaway Посмотреть сообщение
rep plz, согласись, удовольствие от чтения бумажной литераторы без ошибок будет больше!
я уже забыл что такое бумажная литература. для меня она ограничивается почитыванием местной газеты, читать на компе уже привычка

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

Объясните работу функции fread()
Возникла проблема при чтении файла по частям. Вообщем задача состоит в том что...

Не работает программа из книги Герберта Шилдта.
Подскажите и мне тоже из этой книги не работает программа. #include&lt;iostream&gt;...

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

Не работает программа из книги Герберта Шилдта.
При вводе кода из вышеупомянутой книги, выдает 3 ошибки: 1) error C2440: '='...


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

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

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