递归分形

Posted mxzf0213

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归分形相关的知识,希望对你有一定的参考价值。

【递归】分形

题目描述

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

技术分享

盒型分形定义如下:
度数为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的盒型分形。

输入

输入包含多个测试数据,每个测试数据占一行,包含一个正整数n,(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
----------
分析:递归
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <climits>
#include <cstring>
#include <string>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <vector>
#include <list>
#include <ext/rope>
#define rep(i,m,n) for(i=m;i<=n;i++)
#define rsp(it,s) for(set<int>::iterator it=s.begin();it!=s.end();it++)
#define vi vector<int>
#define pii pair<int,int>
#define mod 1000000007
#define inf 0x3f3f3f3f
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define ll long long
#define pi acos(-1.0)
const int maxn=1e3+10;
const int dis[][2]={{0,1},{-1,0},{0,-1},{1,0}};
using namespace std;
using namespace __gnu_cxx;
ll gcd(ll p,ll q){return q==0?p:gcd(q,p%q);}
ll qpow(ll p,ll q){ll f=1;while(q){if(q&1)f=f*p;p=p*p;q>>=1;}return f;}
char a[maxn][maxn];
int len;
void dfs(int l1,int l2,int r1,int r2)
{
    if(l1==0)return;
    int l=l2-l1+1;
    for(int i=l1;i<=l2;i++)
        for(int j=r1;j<=r2;j++)
            a[i-l][j-l]=a[i-l][j+l]=a[i+l][j-l]=a[i+l][j+l]=a[i][j];
    dfs(l1-l,l2+l,r1-l,r2+l);
}
int main()
{
    int i,j,m,n,k,t;
    while(~scanf("%d",&n)&&n!=-1)
    {
        memset(a, ,sizeof(a));
        len=1;
        for(i=1;i<n;i++)len=len*3;
        a[len/2][len/2]=X;
        dfs(len/2,len/2,len/2,len/2);
        for(i=0;i<len;i++)
        {
            for(j=len;a[i][j]== ;j--);
            a[i][j+1]=0;
            printf("%s\n",a[i]);
        }
        puts("----------");
    }
    //system("pause");
    return 0;
}

 

 

以上是关于递归分形的主要内容,如果未能解决你的问题,请参考以下文章

递归分形

python使用递归实现一个分形图形

有没有关于递归算法方面的书?

函数和分形 - 递归树 - Bash!逻辑问题

分形 递归+模拟

Javascript在画布上绘制分形,递归保存和恢复问题