С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
1 / 0 / 0
Регистрация: 30.06.2015
Сообщений: 46

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

23.08.2015, 16:12. Показов 2214. Ответов 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)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.08.2015, 16:12
Ответы с готовыми решениями:

Объясните подробней пример из книги Шилдта
using System; class RangeArray { // Закрытые данные. int а; // ссылка на базовый массив int lowerBound; // наименьший индекс int...

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

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

24
 Аватар для MayaNash
1296 / 470 / 151
Регистрация: 24.08.2011
Сообщений: 2,249
23.08.2015, 16:24
foxsc, вызывается факториал от 4. 4 != 1, так что вызывается факториал от 3, из него вызывается факториал от 2, из него (от 2) вызывается факториал от 1, и на этом рекурсия заканчивается. Факториал от 1 возвращает через стек значение 1, эта 1-ца из стека умножается на 2, и возвращается через стек в факториал от 3, в нем умножается на 3 и 6-ка возвращается в факториал от 4, в нем умножается на 4 и 24 возвращается в main
1
 Аватар для Sn1p3rOk
288 / 175 / 86
Регистрация: 19.04.2014
Сообщений: 1,095
23.08.2015, 16:26
Цитата Сообщение от 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
6 / 6 / 4
Регистрация: 26.06.2015
Сообщений: 83
23.08.2015, 17:02
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
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
23.08.2015, 17:26
Лучший ответ Сообщение было отмечено 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
23.08.2015, 17:29

Не по теме:

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

0
1 / 0 / 0
Регистрация: 30.06.2015
Сообщений: 46
23.08.2015, 17:37  [ТС]
а почему меняется переменная n?в выражении
ans=factr(n-1)*n//почему уменьшается последняя n
0
Заблокирован
23.08.2015, 17:38
foxsc, изучаю тоже самое, только по Дейтелам. у них все доступно разжевано, почитайте. если у одного автора вам непонятна какая-то тема, посмотрите как про тоже самое пишут другие.
я думаю эта картинка облегчит ваше понимание. тут показано развёртывание рекурсивной функции и свёртывание с возвращаемым значением. т.е. на решение каждой ступени, внутри одной функции вызывается точно такая же отдельная функция
Миниатюры
Объясните работу рекурсивной функции из книги Г. Шилдта  
1
Заблокирован
23.08.2015, 17:39
т.е. подсчёт происходит от обратного. умножая от наименьших чисел к наибольшим
0
1 / 0 / 0
Регистрация: 30.06.2015
Сообщений: 46
23.08.2015, 17:41  [ТС]
а книга называется "Как программировать на с++?"
0
 Аватар для MayaNash
1296 / 470 / 151
Регистрация: 24.08.2011
Сообщений: 2,249
23.08.2015, 17:41
foxsc, да
0
Заблокирован
23.08.2015, 17:55
можете мне не верить, но в русском варианте она называется "Как программировать па C++"
Миниатюры
Объясните работу рекурсивной функции из книги Г. Шилдта  
0
23.08.2015, 18:10

Не по теме:

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

0
23.08.2015, 18:12

Не по теме:

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

0
23.08.2015, 18:15

Не по теме:

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

0
23.08.2015, 18:16

Не по теме:

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

0
23.08.2015, 18:23

Не по теме:

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

0
23.08.2015, 20:26

Не по теме:

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

0
23.08.2015, 20:32

Не по теме:

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

0
23.08.2015, 21:47

Не по теме:

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

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.08.2015, 21:47
Помогаю со студенческими работами здесь

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

Разработать программу по алгоритму с использование рекурсивной функции и без использования рекурсивной функции
Разработать программу по алгоритму с использование рекурсивной функции и без использования рекурсивной функции.

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

Книги Шилдта
кто то может объяснить чем существенно отличается Java: The Complete Reference, 8th Edition от Java: A Beginner's Guide, 5th Edition ? и...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru