Школа создателей компьютерных игр

BannerDrive.ru
[Главная] [С чего начать?] [Дистанционное обучение] [Статьи] [Обучалки] [Книги] [Софт] [Форум] [Ссылки] [О сайте]

Рекурсия



Подпишитесь на рассылку "Создание компьютерных игр"

Рассылки Subscribe.Ru
Создание компьютерных игр

Рассылка выходит раз в месяц.


Понравился сайт? Узнайте, как помочь сайту.


Рекомендуемые книги


Андре Ламот.
Программирование трехмерных игр для Windows. Советы профессионала по трехмерной графике и растеризации


Андре Ламот.
Программирование игр для Windows. Советы профессионала


Проголосуйте за сайт в рейтинге GameTop!
(нажмите на кнопку рейтинга)

GameTop - рейтинг игровых ресурсов. Портал Rolemancer (www.rolemancer.ru)

Не забывайте, что результаты рейтинга обновляются раз в неделю. Пожалуйста, голосуйте почаще!


Статистика посещаемости

Rambler's Top100

Запись в файл | Все обучалки раздела | Указатели

Описание

Если вы не знаете, что такое "рекурсия", эта обучалка для вас.

Программа реализует функцию "факториал", демонстрируя использование и работу рекурсии.

Скачать обучалку (Visual C++ 6)

Работа программы

Исходный код

// Done by TheTutor -- 8/26/01

// Перевод © 2004 Евгений Казеко
// www.gamecoder.kazeko.com
// evgeniy@kazeko.com

/*      Итак, что же такое рекурсия? Это понятие не из языка C/C++. Рекурсию можно реализовать
      на любом языке - рекурсия это больше логический процесс, который, когда используется
      правильно, может облегчить выполнение задачи.

      Рекурсия определяется всего лишь как вызов функцией самой себя внутри ее тела.
      Вы запутались? Хорошо, очень быстрый пример рекурсии (который будет длится вечно и
      приведет к зависанию компьютера).

      void badRecursion()
      {
            printf("This will eventually crash\n");

            badRecursion();
      }

      А теперь хороший пример рекурсии. Мы реализуем функцию факториал.
      Проделаем простой математический пример.

      Прежде всего, символ ! в математике означает "факториал".  3! читается как "три факториал".
      Когда берется факториал числа, нужно взять все предыдущие числа начиная с единицы и перемножить.
      Вот так:
      
      3! = 1 * 2 * 3 = 6

      Напишем функцию факториал с помощью рекурсии.
*/

#include <stdio.h>

typedef unsigned int uint;      // Лень писать unsigned int, поэтому определим тип uint

uint factorial(uint num);   // Наша функция факториал.

// Наша функция main довольно слабовата - она просто напечатает число 6 и программа завершится.

int main()
{
      printf("%d\n",factorial(3));

      return 0;
}

/*      А теперь подумаем об определении факториала.
      3! = 1 * 2 * 3 что эквивалентно 3 * (2!)
      Мы знаем, что 1! = 1
      Используя эти простые факты, напишем нашу функцию */

uint factorial(uint num)
{
      // Факториал одного равен одному - таким образом возвращаем один
      if(num == 1)
            return 1;

      else
            return num * factorial(num - 1); // В другом случае возвращаем num * факториал (num - 1)
}

/*      Итак, посмотрим шаг за шагом, что произойдет при вызове factorial(3):


      factorial(3)
      
      "num" не равен 1, поэтому возвращаем num * factorial(2) но перед
      возвратом из функции, должен быть возврат из factorial(2)

            factorial(2)

            "num" не равен 1, поэтому возвращаем num * factorial(1) но перед
            возвратом из функции, должен быть возврат из factorial(1)

                  factorial(1)

                  Здесь num равен 1, поэтому возвращаем 1

            А теперь мы снова в "factorial(2)" на строчке "return num * factorial(1)"
            Вспомните, что в factorial(2) "num" равен 2. И тогда у нас получается, что
            num равен 2 и factorial(1) возвращает 1, то есть вызов factorial(2) 
            возвращает 2 (результат 2 * 1)

      Теперь мы вновь в "factorial(3)" на строке "return num * factorial(2)".
      В factorial(3) "num" равен 3, и то, что у нас есть это num равный 3 и factorial(2)
      возвращает 2, и таким образом функция возвращает 6 (результат 3 * 2)

      Не забывайте, каждый раз когда мы вызываем функцию, мы получаем ЛОКАЛЬНЫЕ копии
      переменных, передаваемых в функции. Это значит, эти локальные копии известны только
      конкретным вызовам функции.
*/

/*
|  TheTutor
|  thetutor@gametutorials.com  
|  © 2001 GameTutorials           
*/

// Перевод © 2004 Евгений Казеко
// www.gamecoder.kazeko.com
// evgeniy@kazeko.com

Скачать обучалку (Visual C++ 6)

Запись в файл | Все обучалки раздела | Указатели

[Главная] [С чего начать?] [Дистанционное обучение] [Статьи] [Обучалки] [Книги] [Софт] [Форум] [Ссылки] [О сайте]

Copyright © 2003-2005 Евгений Казеко. Все права защищены. E-mail: evgeniy@kazeko.com

адреса магазинов термобелье , Купить спальные мешки: спальный мешок зимний.