Рекурсия - это такая процедура, когда очередное значения функции вычисляется через предыдущее значение той же функции. Например, Функция вычисления факториала числа
int fakt( int x) {
if (x == 1) return 1 else return x * fakt (x - 1)
}
Чтобы вычислить факториал х, нужно умножить х на факториал числа х - 1. Значит, сначала нужно вычислить функцию для х - 1, а перед тем для х - 2, и так далее, пока мы не опустимся до 1.
Факториал от 1 задан прямо - он равен 1, адальше функция будет вызывать сама себя и вычислять факториалы 2, 3, и так далее до х.
Но при каждом вызове функции происходит запись адреса функции в стек, поэтому глубина вложений функции в функцию ограничена размером стека.
Другие языки программирования и технологии
Рекурсия в C++ объясните на самом простейшем примере для чайника
void a() {
__printf("abc");
__a();
}
__printf("abc");
__a();
}
рекурсия - это например вызов функции в теле этой же самой функции
пример - функция расчета факториала:
int fact (int a) {
if (a == 1) return 1;
else return fact(a-1)*a;
}
пример - функция расчета факториала:
int fact (int a) {
if (a == 1) return 1;
else return fact(a-1)*a;
}
void func() {
func();
}
func();
}
Рекурсия - это вызов функции себя самой с измененными параметрами. Применяется, когда вычисление можно свести к такому же для более простых (обычно меньших) значений. В функции должно быть предусмотрено, когда эти повторные вызовы закончатся (когда, например, значение функции становится уже известным) , поэтому в ней обязательно должен присутствовать условный оператор.
При рекурсивном вычислении часто алгоритм становится намного проще, но реализуется компьютером такой алгоритм намного медленнее из-за необходимости запоминания им множества промежуточных значений.
Классический и простейший пример - вычисление факториала при помощи рекурсии, приведенный выше Михаилом Грудцыном, впрочем, его можно упростить:
long fact(int x){return x?x*fact(x-1):1;}
При рекурсивном вычислении часто алгоритм становится намного проще, но реализуется компьютером такой алгоритм намного медленнее из-за необходимости запоминания им множества промежуточных значений.
Классический и простейший пример - вычисление факториала при помощи рекурсии, приведенный выше Михаилом Грудцыном, впрочем, его можно упростить:
long fact(int x){return x?x*fact(x-1):1;}
ладно
вот один из примеров рекурсии
// Введите_имя. cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h" //служит для генерации файла предкомпилированных заголовков
#include //Заголовочный файл с классами, функциями и переменными для организации ввода-вывода
#include //математическое выражение
using namespace std; // пространство имён
unsigned long int factorial(unsigned long int);// прототип рекурсивной функции
int i = 1; // инициализация глобальной переменной для подсчёта кол-ва рекурсивных вызовов
unsigned long int result; // глобальная переменная для хранения возвращаемого результата рекурсивной функцией
int _tmain(int argc, _TCHAR* argv[]) // cke;bn для поддержки юникода при передаче агрументов в командной строке
{
int n; // локальная переменная для передачи введенного числа с клавиатуры
cout << "Enter n!: "; //стандартные потоки ввода вывода, которые используются при написании программ
cin >> n;
cout << n << "!" << "=" << factorial(n) << endl; // вызов рекурсивной функции
system("pause");
return 0; //выполняет выход из метода и возвращает результат выполнения метода
}
unsigned long int factorial(unsigned long int f) // рекурсивная функция для нахождения n!
{
if (f == 1 || f == 0) // базовое или частное решение
return 0; // все мы знаем, что 1!=1 и 1!=1
cout << "Step\t" << i << endl;
i++; // операция инкремента шага рекурсивных вызовов
cout << "Result= " << result << endl;
result = f * factorial(f - 1); // функция вызывает саму себя, причём её аргумент уже на 1 меньше
return result;
}
// Введите_имя. cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h" //служит для генерации файла предкомпилированных заголовков
#include //Заголовочный файл с классами, функциями и переменными для организации ввода-вывода
#include //математическое выражение
using namespace std; // пространство имён
unsigned long int factorial(unsigned long int);// прототип рекурсивной функции
int i = 1; // инициализация глобальной переменной для подсчёта кол-ва рекурсивных вызовов
unsigned long int result; // глобальная переменная для хранения возвращаемого результата рекурсивной функцией
int _tmain(int argc, _TCHAR* argv[]) // cke;bn для поддержки юникода при передаче агрументов в командной строке
{
int n; // локальная переменная для передачи введенного числа с клавиатуры
cout << "Enter n!: "; //стандартные потоки ввода вывода, которые используются при написании программ
cin >> n;
cout << n << "!" << "=" << factorial(n) << endl; // вызов рекурсивной функции
system("pause");
return 0; //выполняет выход из метода и возвращает результат выполнения метода
}
unsigned long int factorial(unsigned long int f) // рекурсивная функция для нахождения n!
{
if (f == 1 || f == 0) // базовое или частное решение
return 0; // все мы знаем, что 1!=1 и 1!=1
cout << "Step\t" << i << endl;
i++; // операция инкремента шага рекурсивных вызовов
cout << "Result= " << result << endl;
result = f * factorial(f - 1); // функция вызывает саму себя, причём её аргумент уже на 1 меньше
return result;
}
Похожие вопросы
- Для чего нужен Pascal если есть C или C++ объясните чайнику?
- программа C# if i % x == 0 пример
- объясните, пожалуйста, что такое байт? для чайников спасибо всем
- visual c++ объясните, пожалуйста, что означает каждая строчка. задание: найти число различных элементов в массиве
- C++ Объясните пож. на доступном языке про спецификаторы класса памяти. В инете и в книгах слишком заумно. Продолж ниже.
- C#.Объясните код. Class + Enum
- Прошу объяснить как работает рекурсия в конкретном примере:
- Учусь програмировать на C++ по книге "C++ для чайников".Проблема.
- Книга c++ для чайников устарела?
- Стоит ли использовать рекурсию в целом? (+)