Мне нужно написать рекурсивную функцию, которая выводит деления английской линейки.
Проблема в том, что мне нужно передать только один параметр, но мне нужно, чтобы линейка была длиной (2 ^ k)-1 тика (так что для k = 4 будет напечатано 15 тиков).
Пример:
void printRuler(int k) {
if (k == 0) {
return;
}
if (k % 8 == 0) {
printf("----");
}
else if (k % 4 == 0) {
printf("---");
}
else if (k % 2 == 0) {
printf("--");
}
else {
printf("-");
}
printf("\n");
drawRuler(k - 1);
}
Мой код, очевидно, выводит только k тиков.
Как мне отслеживать, сколько я напечатал внутри рекурсии?
Я обновил ответ в соответствии с вашим беспокойством. в настоящее время ваша функция недействительна, вы должны изменить свою функцию примерно так:
int drawRuler(int k) {
int count = 0;
if (printing executed here) {
count++;
//print
}else if (printing executed here')
{
count++;
//print
}
return count + drawRuler(k - 1);
}
int main() {
int totalCountOfPrintings = drawRuler(k)
print(totalCountOfPrintings);
}
Мне нужно, чтобы функция работала сама по себе, к сожалению
Я изменил ответ, основываясь на вашем совете, дорогой.
Давайте подойдем к этому системно. Для первых трех k ваши линейки выглядят так:
1 ─ 2 ─ 3 ─
── ──
─ ─
───
─
──
─
Здесь вы можете увидеть закономерность: линейка k — это отметка длиной k единиц с линейкой k − 1 с каждой стороны. Если наклонить голову, то получится полное бинарное дерево.
Вот ваша рекурсия: напечатайте линейку для k − 1; распечатать центральную галочку; напечатайте другую линейку для k − 1. В C:
void ruler(int k)
{
if (k > 0) {
ruler(k - 1);
switch(k) {
case 0: break;
case 1: puts("-"); break;
case 2: puts("--"); break;
case 3: puts("---"); break;
default: puts("----"); break;
}
ruler(k - 1);
}
}
(Конечно, настоящая линейка будет начинаться и заканчиваться длинным тиком. Но это даст 2k + 1 тик, и это будет нелегко выполнить с помощью хорошей рекурсии, подобной приведенной выше.)
Печать 2 ^ k − 1 тиков предполагает, что ваша (линейная) рекурсия здесь не подходит. Я думаю, что печать должна выглядеть как обход по порядку полного бинарного дерева глубины k.