Я не думаю, что вы должны избегать l oop, используемого для создания отступа, но его действительно можно заменить на рекурсию.
Чтобы найти рекурсивное решение для печати N вкладок, мы спросили себя: как я могу определить печать N вкладок с точки зрения печати различного количества вкладок?
Ну, вы можете напечатать N вкладок, напечатав одну вкладку, а затем напечатав N-1 вкладок.
void print_indent(unsigned i) {
if (!i)
return;
printf("\t");
print_indent(i-1);
}
print_indent(depth);
Фактически любой l oop может быть заменен рекурсией.
Мы знаем, что можем исключить рекурсию хвостового вызова с помощью al oop. Делая процесс в обратном порядке, мы знаем, что
while (cond()) {
body();
}
можно записать как
void recursive_loop() {
if (!cond())
return;
body();
recursive_loop();
)
Мы также знаем, что
for (init(); cond(); post()) {
body();
}
- это просто еще один способ запись
init();
while (cond()) {
body();
post();
}
, поэтому
for (int i=0; i<depth; ++i) {
printf("\t");
}
можно записать как
void print_indent(int depth, int i) {
if (i >= depth) {
return;
printf("\t");
++i;
print_indent(depth, i);
}
int i = 0;
print_indent(depth, i);