【递归与分治算法】分形的递归输出

分形,具有以非整数维形式充填空间的形态特征。通常被定义为“一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状”,即具有自相似的性质。

一个盒状分形定义如下: 度为1的盒分形为:

x

度为2的盒分形为:

X X
 X
X X

依次类推,如果B(n-1)表示n-1度的盒分形,则n度的盒分形递归定义如下:

B(n - 1)        B(n - 1)

        B(n - 1)

B(n - 1)        B(n - 1)

请画出度为n的盒分形的图形

输入格式:

输入一系列度,每行给出一个不大于7的正整数。输入的最后一行以-1表示输入结束

输出格式:

对于每个用例,输出用'X'标记的盒状分形。在每个测试用例后输出包含一个短划线“-”的一行。

输入样例:

1
2
3
4
-1

输出样例:

注意:每行的空格请输出完整。
X
-
X X
 X 
X X
-
X X   X X
 X     X 
X X   X X
   X X   
    X    
   X X   
X X   X X
 X     X 
X X   X X
-
X X   X X         X X   X X
 X     X           X     X 
X X   X X         X X   X X
   X X               X X   
    X                 X    
   X X               X X   
X X   X X         X X   X X
 X     X           X     X 
X X   X X         X X   X X
         X X   X X         
          X     X          
         X X   X X         
            X X            
             X             
            X X            
         X X   X X         
          X     X          
         X X   X X         
X X   X X         X X   X X
 X     X           X     X 
X X   X X         X X   X X
   X X               X X   
    X                 X    
   X X               X X   
X X   X X         X X   X X
 X     X           X     X 
X X   X X         X X   X X
-

参考代码(c语言)

#include"stdio.h"
#include"math.h"
char maps[730][730];
int a[730];

int main(){
    int i=0,j,n,p;
    void print();
    
    for(p=0;;p++){
        scanf("%d",&n);
        a[p]=n;
        if(n==-1)
        break;
    }
    for(p=0;;p++){
        if(a[p]!=-1){
        int size=pow(3,a[p]-1);
        for(i=0;i<size;i++){
            for(j=0;j<size;j++){
                maps[i][j]=' ';
                maps[i][size] ='\0';
                }
                }
    print(a[p],0,0);
    for(i=0;i<size;i++)
    printf("%s\n",maps[i]);
    printf("-\n");
}else return 0;
}

}
void print(int n,int x,int y){
    if(n==1){maps[x][y]='X';
    }   
    else{
        int m = pow(3,n-2); 
        print(n-1,x,y);
        print(n-1,x+2*m,y);
        print(n-1,x+m,y+m);
        print(n-1,x,y+2*m);
        print(n-1,x+2*m,y+2*m);
    }
}

PTA平台编译器提示
a.c: In function ‘main’:
a.c:11:3: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d",&n);
   ^~~~~~~~~~~~~~

关于这个warning解决处理方法详见:Warning: ignoring return value of 'scanf', declared with attribute warn_unused_result

算法分析

度为n的盒状分形图实质为长宽为3^(n-1)的正方形,其规模为3^(n-1)
利用二维字符数组maps[730][730]绘制、存储并输出盒分形图(3^6=729)。
设置函数print(int n,int x,int y)绘制左上角的盒分形。

①递归边界:n=1,此时将数组maps[x][y]的值设为X
②若n>1,则计算n-1度的盒子的规模m = 3^(n-2),分别在左上方, 右上方,中间,左下方和右下方画出5个n-1度的盒子。
对于左上方的n-1度的盒子,左上角的坐标为(x,y),递归print(n-1,x,y)生成;
对于右上方的n-1度的盒子,左上角的坐标为(x+2m,y),递归print(n-1,x+2m,y)生成;
对于中间的n-1度的盒子,左上角的坐标为(x+m,y+m),递归print(n-1,x+m,y+m)生成;
对于左下方的n-1度的盒子,左上角的坐标为(x,y+2m),递归print(n-1,x,y+2m)生成;
对于右上方n-1度的盒子,左上角的坐标为(x+2m,y+2m),递归print(n-1,x+2m,y+2m)生成;

示意图.jpg

————————————————
参考原文链接:https://blog.csdn.net/a253664942/article/details/45566889

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,776评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,527评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,361评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,430评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,511评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,544评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,561评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,315评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,763评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,070评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,235评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,911评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,554评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,173评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,424评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,106评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,103评论 2 352

推荐阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,340评论 0 2
  • sì 支zhī茶chá 对duì 酒jiǔ,赋fù 对duì 诗shī,燕yàn子zi 对duì 莺yīng 儿é...
    每个人的孟母堂阅读 1,204评论 0 6
  • 一年级语文上册生字表 生字表一(共400字) 啊(ā)爱(ài)安(ān)岸(àn)爸(bà)八(bā)巴(bā)...
    meychang阅读 2,788评论 0 6
  • 栈与递归 栈还有一个重要应用是在程序设计语言中实现递归。一个直接调用自己或通过一系列的调用语句间接的调用自己的函数...
    Mr_Bluyee阅读 3,107评论 0 1
  • 废话不多说,就问你还相信爱情吗? 看了这么多的出轨门,人性的脆弱,贪婪昭然若揭。每次一发生像佟丽娅陈思诚这样的新闻...
    猫猫喵少阅读 4,299评论 3 6