Реферат Курсовая Конспект
Recursive factorials - раздел Философия, Unit 3. Recursion 3.1 The Basic Concept Of Recurs...
|
Unit 3. Recursion 3.1 The Basic Concept of Recursion 3.2 Problem Solving with Recursion | ||||||||||||||||||
Recursive Functions
A recursive function is a function that calls itself. The use of recursive functions, called recursion, can yield elegant solutions to otherwise complex problems. C++, like many other programming languages, supports recursion.
A programmer must define recursive functions carefully in order to avoid creating a function that repeatedly calls itself forever. A pseudocode version of a typical recursive function looks like the following example.
if (simplest case) then
solve directly
else
make recursive call to a simpler case
Example 1 A typical recursive function
A key to creating and using effective recursive functions is learning to think of a problem in terms of a similar, but smaller problem. Eventually, a problem becomes small enough that a function can solve it without using recursion. This is called the base case.
Calculating factorials is one example of a problem that we can solve using recursion. The factorial of a number is the product of all the integers from that number to one. For example, the factorial of five (often called "five factorial") equals 5 * 4 * 3 * 2 * 1. This evaluates to 120. Three factorial (3 * 2 * 1) equals the value 6. An exclamation point denotes the factorial of a number. Thus, "five factorial" can be expressed as 5!. Example 2 lists some of the first several positive integers and the calculation of their factorials. The factorial for zero is a special case and is defined to equal 1.
5! = 5 * 4 * 3 * 2 * 1 = 120
4! = 4 * 3 * 2 * 1 = 24
3! = 3 * 2 * 1 = 6
2! = 2 * 1 = 2
1! = 1
0! = 1
Example 2 Some factorials
We can express factorials recursively, that is, in terms of other factorials. Consider the factorial calculation for the value 5. From Example 2, the calculation is 5! = 5 * 4 * 3 * 2 * 1. But, from examining the factorial calculation for 4, we know that 4! = 4 * 3 * 2 * 1. Recursively then, 5! = 5 * 4!. Example 3 lists the recursive definitions of the same numbers from Example 2. Since we cannot express zero factorial recursively, it is the base case.
5! = 5 * 4!
4! = 4 * 3!
3! = 3 * 2!
2! = 2 * 1!
1! = 1 * 0!
0! = 1
Example 3 Recursive factorials
Listing 1 contains C++ code that recursively calculates factorials. Notice that function factorial follows the recursive function pattern outlined in Example 1.
Execution of the program in Listing 1 outputs the expected value of 120. We know this is correct, but how did the function achieve this result? Adding output statements to function factorial gives us a better idea how this example works. Listing 2 contains an updated function factorial that outputs a line indicating when an instance of the function begins and when an instance of the function is about to end. This modified version also outputs the return value of function factorial.
Example 4 contains the output of the factorial program after the addition of the output statements to function factorial.
The output in Example 4 shows that the program first calls function factorial with the argument 5. Function main performs this initial call. During the execution of factorial(5) it makes a call to function factorial with an argument value of 4. The instance of factorial(4) then begins execution and makes a call to factorial(3), which in turn makes a call to factorial(2). This behavior continues until factorial(0) begins and returns the value 1. After this, factorial(1) returns to factorial(2) the value 1, factorial(2) returns to factorial(3) the value 2, and so on until factorial(5) returns to main the value 120. The Call StackStepping through the function calls in Listing 3 demonstrates how a program uses the call stack to manage the function calls in a program. As in… Figure 1 The call stack during various… When main calls function method1, the run-time system pushes an activation record for method1 onto the top of the…Removing RecursionFor example, the following loop-based factorial function is guaranteed to execute faster and consume less memory (in the call stack) than the… It is always possible to eliminate recursion, and it is worthwhile to think…Problem Solving with Recursion Divide and ConquerFigure 1 Dividing a problem Generally, divide and conquer algorithms utilize two recursive function… Figure 2 The combined solutionBacktracking. The ConceptFigure 1 A maze Backtracking involves pursuing one possible solution until the algorithm… Backtracking algorithms that use recursion operate basically the same way as other recursive algorithms. Similar to…The ProblemThe game of chess is played on a board containing 64 squares of alternating color. Two players take turns moving a set of pieces on these squares.… Figure 2 Queens attack in two different ways Combining these two methods together, we see (again in red) all the squares on a chessboard that a queen can attack…The SolutionFigure 6 Seven queens placed, but we must backtrack The backtracking portion of the algorithm would then attempt to move the… The above implementation of the Eight Queens problem outputs the first solution it finds and then terminates. As an…The Call StackПродвижение посредством вызовов функции в листинге 3 демонстрирует, как программа использует стек вызовов, чтобы управлять вызовами функции в… Figure 1 The call stack during various points of Listing 3 Когда main функция вызывает method1, система времени выполнения вталкивает активацию записи method1 на вершину стека…Замена рекурсииНапример, следующая основанная на цикле факториал-функция выполняется быстрее и использует меньше памяти (в стеке вызовов) чем рекурсивная версия,… Всегда (во всех случаях) можно заменять рекурсию, и лучшая замена это замена…Решение задач с Рекурсией Разделяй и властвуй Последовательность разделяй и властвуй использует рекурсию, чтобы решать проблемы, "деля" задачу на меньшие подзадачи. Base case рекурсии решает группу самых маленьких подзадач. "Властвовать" часть этой проблемы, которая происходит когда метод комбинирует эти решения создавая решение исходной проблемы.
Обычно, алгоритмы «разделяй и властвуй» используют два вызова рекурсивной функции. Наличие двух рекурсивных вызовов непрерывно делит пространство задач на две части. Рисунок 1 иллюстрирует типичный шаг "дележа", который использует два рекурсивных вызова. Когда рекурсия достигает base case, подзадача решается непосредственно. Решения этих подзадач объединяются вместе (поскольку рекурсия раскручивается), и в конечном счете обеспечивают решение исходной проблемы. Рисунок 2 показывает решенные подзадачи, объединенные в решение для исходной проблемы.
Рассмотрим проблему вычисления суммы квадратов диапазона целых чисел. Мы можем применить разделение и использовать подход, чтобы уменьшать диапазон непрерывно, пока мы не достигаем подзадачи размера, который легко вычисляется. Листинг 1 содержит исходный код для этого рекурсивного, основанного алгоритма разделяй и властвуй.
Другой пример простого и эффективного алгоритма разделяй и властвуй, приведен в листинге 2.
Функция find_smallest определяет самый маленький элемент, сохраненный в массиве, непрерывно деля массив на два мелких кусочка. Когда эти части являются достаточно маленькими, что они только содержат один элемент, алгоритм тогда сравнивает элементы, сохраненные в двух частях, и возвращает меньшие из этих двух элементов. Отслеживание в обратном порядке. ПонятиеРисунок 1 лабиринт Отслеживание в обратном порядке включает преследование одного возможного… Алгоритмы «отслеживание в обратном порядке», которые используют рекурсию, управляет в основном тем же самым путем…ПроблемаВ игру шахмат играют на доске, содержащей 64 квадрата переменного цвета. Два игрока поочередно передвигают ряд фигур по этим квадратам. Цель игры… Рисунок 2 атака Куинса двумя различными способами Комбинируя эти два метода вместе, мы видим (снова в красном) все квадраты на шахматной доске, которую королева может…РешениеРисунок 6, Seven queens placed, but we must backtrack Часть отслеживания в обратном порядке алгоритма тогда попыталась бы… Вышеупомянутая реализация проблем Восьми Королев выводит первое решение, которое это находит и затем завершает. Как …– Конец работы – Используемые теги: Recursive, factorials0.054 Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: Recursive factorials Что будем делать с полученным материалом:Если этот материал оказался полезным для Вас, Вы можете сохранить его на свою страничку в социальных сетях:
Хотите получать на электронную почту самые свежие новости?Подпишитесь на Нашу рассылку
Наша политика приватности обеспечивает 100% безопасность и анонимность Ваших E-Mail
Реклама |
Новости и инфо для студентов