使用C中的递归打印Cantor集

时间:2014-02-23 16:24:53

标签: c recursion

我正在尝试使用'x'将Cantor Set打印到控制台,但是我坚持第二次递归,无论我做什么,只是不执行。

想法是首先使用clearP()初始化矩阵,所以我不必担心空白。之后,我使用深度作为[y]值加载带有'x'字符的数组。

要删除每一行的中间段,我使用secondLength和smallerLength。现在使用2个递归调用的原因是,例如在深度1上,它将中间部分移除一次,在深度2上移除两次,在深度3移除四次,依此类推。但是我只是无法执行第二次递归,这就是为什么我的输出看起来像this

我犯错误的建议吗?

#include <stdio.h>
#include <math.h>
#define WIDTH 27
#define HEIGHT (int)(cbrt(WIDTH)+1)


void clearP(char p[WIDTH][HEIGHT]){
    int x, y;
    for(x = 0; x<WIDTH; x++){
        for (y=0;y<HEIGHT;y++){
            p[x][y] = ' ';
        }
    }
}

void printP(char p[WIDTH][HEIGHT]){
    int x, y;
    for(y = 0; y<HEIGHT; y++){
        for (x=0;x<WIDTH;x++){
            printf("%c",p[x][y]);
        }
            printf("\n");
    }
}

void cantor(char p[WIDTH][HEIGHT],int start,int end, int depth){
    int smallerLength = end / 3;                            
    int secondStart = start + (smallerLength * 2);

    for (int x = start; x<end ; x++){
            p[x][depth] = 'x';
    }

    if (depth == HEIGHT){
        return;
    }

    cantor(p, start, smallerLength, depth+1); 
    cantor(p, secondStart, smallerLength, depth+1);
    }

int main(){
char canvas[WIDTH][HEIGHT];
    clearP(canvas);
    cantor(canvas, 0, WIDTH, 0);
    printP(canvas);
}

2 个答案:

答案 0 :(得分:0)

我认为你的高度和宽度混合在一起。

试试这个

void printP(char p[WIDTH][HEIGHT]){
int x, y;
for(x = 0; x<HEIGHT; x++){
    for (y=0;y<WIDTH;y++){
        printf("%c",p[x][y]);
    }
    printf("\n");
}
}

答案 1 :(得分:0)

如果它的三元表示不包含任何1(即只有0和2),则[0,1]中的点在Cantor集合中。这种观察允许您通过查看基数3中i / n的小数部分的前d个数字来输出d级表示,而不需要数组。

#include <stdio.h>

void cantor(int n, int d) {
    for (int i = 0; i < n; i++) {
        int in = 1;
        int x = i;
        for (int j = 0; j < d; j++) {
            in = in && !(3*x >= n && 3*x < 2*n);
            x = (3*x)%n;
        }
        putchar(in ? 'x' : ' ');
    }
    putchar('\n');
}

int main(int argc, char *argv[]) {
    for (int d = 0; d < 5; d++) {
        cantor(81, d);
    }
    return 0;
}