我正在尝试使用'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);
}
答案 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;
}