3

シェルピンスキーのフラクタルと呼ばれるフラクタルを表示するプロジェクトをcでコーディングしようとしています(ノードは「#」で表されます)。したがって、1-シェルピンスキーの三角形は次のようになります。

##
#

2シェルピンスキーの三角形

####
# #
##
# 

など...これがどのように見えるかを見つけるためのリンクです: http ://fr.wikipedia.org/wiki/Triangle_de_Sierpiński

再帰的な方法だけで、ループなしで実行できると言われました。だから私は次のようなものを試しました:

//extracting the power of two's index
int puiss_2(int N){
    int i=0,j=1;
    for(i=0;i<N;i++){
        j=j*2;
        i++;
    }
    return j;
}

//the recursive method
void fractal(int N)
{
    int M;
    M= puiss_2(N);


    if(M==0){
        printf("##\n");
        printf("# ");
    }
    else{
        fractal(N-1);
        fractal(N-1);
        printf("\n");
        fractal(N-1);
        printf(" ");
    }
}

int main()
{
    int N;
    scanf("%d",&N);
    fractal(N);
}

もちろん、行にジャンプすると元に戻せないので、うまくいきませんでした。だから私がそれを2回呼ぶとき:

フラクタル(N-1); フラクタル(N-1);

2つの連続した動機が互いに並んで集められていません...誰かがそれを作る方法についての考えを持っていますか?それとも、アルゴのデザインが完全に間違っていたのでしょうか。

4

3 に答える 3

2

これはおそらく複雑ですが、再帰的なコードです!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void sierpinsky(int N, char c[1000]){
    int i=0,j,k,l,born;

    for(i=0;i<N;i++){printf("%c",c[i]);}
    printf("\n");

    if(N==1){}
    else{
        if((c[0]=='#')&&(c[1]=='#')&&(c[2]=='#')){
            for (j=0;2*j<N;j++){
                if(c[2*j]=='#'){
                    c[2*j]='#';c[2*j+1]=' ';
                }
                else{
                    c[2*j]=' ';c[2*j+1]=' ';
                }
            }
        }
        else if ((c[0]=='#')&&(c[1]!='#')&&(c[2]=='#')){
                for (j=0;4*j<N;j++){
                    if(c[4*j]=='#'){
                        c[4*j]='#';c[4*j+1]='#';c[4*j+2]=' ';c[4*j+3]=' ';
                    }
                    else{
                        c[4*j]=' ';c[4*j+1]=' ';c[4*j+2]=' ';c[4*j+3]=' ';
                    }
                }
            }
        else if ((c[0]=='#')&&(c[1]!='#')&&(c[2] !='#')){
                k=0;
            while(c[k+1] !='#'){k++;}
            born = k+1;
            j=0;

            while(j<N){
                if((c[j]=='#')&&(c[j+born]=='#')){
                for(l=0;l<born;l++){
                    c[j+l]='#';
                    }
                    j=j+born+1;
                }

                else if ((c[j]!='#')&&(c[j-1+born]=='#')&&(c[j-1+2*born] !='#'))
                {
                    c[j-1]='#';
                    for(l=0;l<born;l++){
                        c[j+l]='#';
                    }
                    j=j+born+1;
                }
                else{
                    c[j-1]= ' ';
                    c[j]=' ';
                    j++;
                }
            }
        }
        else if ((c[0] =='#')&&(c[1] =='#')&&(c[2] !='#')){
            for (j=0;4*j<N;j++){
                if(c[4*j]=='#'){
                    c[4*j]='#';c[4*j+1]=' ';c[4*j+2]=' ';c[4*j+3]=' ';
                }
                else{
                    c[4*j]=' ';c[4*j+1]=' ';c[4*j+2]=' ';c[4*j+3]=' ';
                }
            }

        }
            else{}

            sierpinsky(N-1, c);
        }
    }

int main()
{   int i,size;
    scanf("%d",&size);
    char c[1000];
    for(i=0;i<size;i++){c[i]='#';}
    for(i=size;i<1000;i++){c[i]='a';}
    sierpinsky(size, c);
}
于 2012-10-20T01:53:46.453 に答える
0

これには再帰は必要ないと思います。トリプレットを#1セットとします。したがって、n=の値はNo. of levels of the set上下に印刷することになっています。最初の行で、セットをn回印刷します。次の行では、n-1回というように続きます。繰り返し試してください。
編集:再帰的な解決策を探していた場合は、私の答えを無視してください。

于 2012-10-02T14:03:42.397 に答える
0

おそらく、パスカル三角形を使用してこれをコーディングできます。1 1 1 1 2 1 1 3 3 1 1 4 6 4 1

この三角形全体をループで出力できれば、おそらく偶数を飛ばすことができます。

単純な三角形を印刷するには、必要な行数に関連してスペースの数を数え、forループ(またはそれらのいくつか)を使用してコーディングします。どの(パスカル)番号がどの印刷に対応するかを確認し、偶数をスキップします.

于 2013-09-23T20:29:47.967 に答える