c - 在递归中保持计数?
问题描述
我需要编写一个递归函数来打印出英文标尺的刻度。
问题是我只需要传递一个参数,但我需要标尺为 (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 个刻度。
如何跟踪我在递归中打印了多少?
解决方案
让我们系统地处理这个问题。对于 forst 3 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);
}
}
(当然,真正的标尺会以长滴答声开始和结束。但这会产生 2 k + 1 个滴答声,并且通过像上面这样的递归来完成并不容易。)