Каждый раз, когда вы вызываете функцию рекурсивно, она эффективно создает новую копию необходимой ей информации и продолжает.
У вас может быть программа, которая повторяется «бесконечно», то есть до тех пор, пока она не исчерпает ресурсы, обычно это пространство стека - пространство, в котором идут эти копии. Это будет выглядеть
void recur(){
recur();
}
int main(){
recur();
exit(0); /* won't ever really get here.*/
}
Очевидно, что это не очень полезно, так что вы хотите, чтобы написать программу, которая имеет некоторые ограничения на то, как часто рецидивирует. Вот очень простая программа, которая управляет, что:
#include <iostream>
using namespace std;
void recurSome(int count){
cout << "RecurSome called with " << count << endl;
if (count > 0){
recurSome(count-1);
cout << "Back at " << count << endl;
}else{
cout << "Bottom." << endl;
}
return;
}
int main(){
recurSome(10);
exit(0); /* now it will get here. */
}
Если скомпилировать и запустить, что, скажем, с:
bash $ g++ -Wall -o rc recursome.cpp
bash $ ./rc
Вы получите результаты:
RecurSome called with 10
RecurSome called with 9
RecurSome called with 8
RecurSome called with 7
RecurSome called with 6
RecurSome called with 5
RecurSome called with 4
RecurSome called with 3
RecurSome called with 2
RecurSome called with 1
RecurSome called with 0
Bottom.
Back at 1
Back at 2
Back at 3
Back at 4
Back at 5
Back at 6
Back at 7
Back at 8
Back at 9
Back at 10
bash $
Посмотрите, как это получает вызов на 10, затем 9 и т. д., а затем после того, как он достигает дна, он показывает, что он возвращается на 1, затем 2 и т. д. обратно до 10?
Основное правило заключается в том, что каждый рекурсивная функция должна иметь что-то, что делает базовый вариант, тот, который делает называть себя снова. В этом, базовый случай count == 0
и на самом деле мы могли бы написать это как рекурсивное определение
recursome:
если с = 0: печать снизу
если с> 0: счетчик печати и recursome (c-1)
Вы увидите много рекурсивных определений этого типа, когда будете двигаться по математике.
Вот несколько niftier версия C с лучшим выходом:
#include <stdio.h>
#include <stdlib.h>
int max = 10;
void recurSome(int count){
printf("RecurSome %*c Called with %d\n", max-count+1, ' ', count);
if (count > 0){
recurSome(count-1);
printf("RecurSome %*c Back at %d\n", max-count+1, ' ', count);
}else{
printf("RecurSome %*c Bottom.\n", 2*max, ' ');
printf("RecurSome %*c Back at %d\n", max-count+1, ' ', count);
}
return;
}
int main(){
recurSome(max);
exit(0); /* now it will get here. */
}
Выход:
RecurSome Called with 10
RecurSome Called with 9
RecurSome Called with 8
RecurSome Called with 7
RecurSome Called with 6
RecurSome Called with 5
RecurSome Called with 4
RecurSome Called with 3
RecurSome Called with 2
RecurSome Called with 1
RecurSome Called with 0
RecurSome Bottom.
RecurSome Back at 0
RecurSome Back at 1
RecurSome Back at 2
RecurSome Back at 3
RecurSome Back at 4
RecurSome Back at 5
RecurSome Back at 6
RecurSome Back at 7
RecurSome Back at 8
RecurSome Back at 9
RecurSome Back at 10
Отличный пример: +1. Я сменил язык на C++, так как это тот язык, о котором спрашивал OP. Надеюсь, вы не возражаете! –
Нет большой. Шахта также компилируется как C++. Спасибо за выполнение работы по ее изменению. –
«Нижнее» - приятное прикосновение. – JeffH