![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Заблокирован
Регистрация: 25.05.2009
Сообщений: 284
|
![]()
Ребята! Вот дошёл до темы рекурсия, и вроде тему из школы роходили, но смотрю на программу, и что-то не могу понять вот эту строку:
Код:
Код:
12*6*2 = ........как тогда получается результат 24 ? |
![]() |
![]() |
![]() |
#2 |
В тени
Старожил
Регистрация: 19.12.2008
Сообщений: 5,788
|
![]()
Рассмотрим вызов функции:
Код:
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем. ___________________________________ ___________________________________ _______ [=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль] |
![]() |
![]() |
![]() |
#3 | |
Пользователь
Регистрация: 19.06.2009
Сообщений: 57
|
![]()
Смотри: факториал - это произведение всех целых чисел до данного числа, включая число. Тогда не сложно догадаться, что если факториал 3 умножить на 4, то получим факториал 4, если его умножить на 5, получим факториал пяти и т.д. Отсюда видим, что факториал какого-либо числа можно вычислить, зная факториал предыдущего числа. Т.е. 4! = 1*2*3*4 = 3!*4, т.к. 1*2*3 - это не что иное, как 3! Так же нам заведомо известно, что 1! = 1. Думаю, не надо объяснять почему))
А теперь смотрим, что говорится в функции: если требуется вычислить 1!, то возвращаем 1, но если же не 1, то берём факториал предыдущего числа [factr(n-1)] и умножаем его на данное число. В свою очередь, для этого мы вызываем ту же функцию factr(), которая считает 3! точно так же. И так до тех пор, пока мы не дойдём но 1, факториал которой нам уже известен. Т.е. функция как бы вызывает сама себя, это и есть рекурсия. Теперь по поводу этого: Цитата:
3! = 1*2*3 = 6; 4! = 3!*4 = 6*4 = 24. Здесь рекурсия как бы раскладывает этот факториал. Давай посмотрим всё в развёрнутом виде: Итак, factr(4) = factr(3)*4 = factr(2)*3*4 = factr(1)*2*3*4 = 1*2*3*4 = 24 Откуда взялось factr(3)*4 я уже говорил. Просто умножаем факториал предыдущего числа на само число. Откуда взялось factr(3)*4 = factr(2)*3*4: давай на мгновение забудем про четвёрку и вспомним только про 3!. factr(3) = factr(2)*3. А вот теперь вспоминаем про нашу четвёрку и домножаем всё это дело на 4: factr(2)*3*4. Точно так же считается и 2!, а 1! нам уже известен заранее. Надеюсь, доходчиво объяснил? ![]() |
|
![]() |
![]() |
![]() |
#4 |
Заблокирован
Регистрация: 25.05.2009
Сообщений: 284
|
![]()
Что-то я вас не до конца понимаю.
Вот так будет что ли происходить возвращение вы имеете ввиду: (4-1)*4 (3-1)*3 (2-1)*2 (1-1)*1 А потом return(answer); всё что в скобочках проигнорирует, а то что за скобочками умножит? 1*2*3*4 Извиняюсь, поздно задал. Ответ вверху, сейчас почитаю. |
![]() |
![]() |
![]() |
#5 |
Пользователь
Регистрация: 19.06.2009
Сообщений: 57
|
![]()
я как раз писал про это
|
![]() |
![]() |
![]() |
#6 |
Заблокирован
Регистрация: 25.05.2009
Сообщений: 284
|
![]()
Я думал, что должно было происходить вот так,если допустим нужно найти факторила !5:
Код:
Код:
Тоесть: Начальное возвращение: Код:
Код:
Последний раз редактировалось Golovastik; 15.09.2009 в 15:56. |
![]() |
![]() |
![]() |
#7 |
Участник клуба
Регистрация: 15.07.2008
Сообщений: 1,933
|
![]()
Оно не игнорируется, а отправляется в функцию factr в качестве параметра... опять же, учите мат. часть
|
![]() |
![]() |
![]() |
#8 |
Пользователь
Регистрация: 19.06.2009
Сообщений: 57
|
![]()
ничего не игнорируется. в данном случае скобки как бы раскрываются (вспоминаем школу) до того момента, пока не получится 1.
давайте рассмотрим 5! здесь равно я использую именно как равно, а не как присваивание: factr(5) = factr(4) * 5 = factr(3)*4*5 = factr(2)*3*4*5 = factr(1)*2*3*4*5 т.к. factr(1) нам уже известен, то в результате получаем factr(5) = 1*2*3*4*5 в вышеприведённом выражении каждый факториал раскладывается на произведение факториала предыдущего числа на данное число. делается это до тех пор, пока нем не нужно будет найти 1!, результат которого уже заранее прописан в ветвлении. |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Рекурсия. | p@ul | Помощь студентам | 4 | 30.12.2009 14:46 |
си рекурсия | world12_tk | Помощь студентам | 1 | 10.04.2009 23:06 |
Рекурсия | vitekbest | Помощь студентам | 1 | 30.05.2008 22:22 |
рекурсия | Vital_k | Паскаль, Turbo Pascal, PascalABC.NET | 1 | 08.02.2008 13:09 |
Рекурсия | АнНютик | Паскаль, Turbo Pascal, PascalABC.NET | 1 | 29.01.2008 22:50 |