首页 > 解决方案 > 在递归中保持计数?

问题描述

我需要编写一个递归函数来打印出英文标尺的刻度。

问题是我只需要传递一个参数,但我需要标尺为 (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 个刻度。

如何跟踪我在递归中打印了多少?

标签: c

解决方案


让我们系统地处理这个问题。对于 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 个滴答声,并且通过像上面这样的递归来完成并不容易。)


推荐阅读