Каждый раз, когда вы вызываете функцию рекурсивно, она эффективно создает новую копию необходимой информации и продолжает работу.
У вас может быть программа, которая повторяется «бесконечно», т. Е. До тех пор, пока у нее не закончатся ресурсы, обычно это место в стеке - пространство, в котором находятся эти копии. Это будет выглядеть как
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:
если c = 0: напечатать дно
если c> 0: счетчик печати и рекурсивный (c-1)
По мере продвижения по математике вы увидите много рекурсивных определений такого рода.
Вот несколько более изящная версия 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