2016-10-26 3 views
0

재귀를 사용하여이 프랙탈 패턴을 만들려고합니다.재귀를 사용하여 프랙탈 패턴 만들기

void pattern(ostream& outs, unsigned int n, unsigned int i){ 

    if (n == 1){ 
     outs << "*"<<endl; 
    } 

    else{ 
     pattern(outs, n/2, i + 1); 
     for (int k = 0; k < n; k++){ 
      outs << "* "; 

     } 
     outs<<endl; 


     for (int k = 0; k < i; k++){ 
      outs << ' '; 
     } 

     pattern(outs, n/2, i + 1); 

    } 

가}

내 코드가 무엇을해야 출력 :

void pattern(ostream& outs, unsigned int n, unsigned int i); 
// Precondition: n is a power of 2 greater than zero. 
// Postcondition: A pattern based on the above example has been 
// printed to the ostream outs. The longest line of the pattern has 
// n stars beginning in column i of the output. For example, 
// The above pattern is produced by the call pattern(cout, 8, 0). 

지금까지, 이것이 내가 무엇을 가지고 :

* 
* * 
    * 
* * * * 
    * 
    * * 
     * 
* * * * * * * * 
     * 
     * * 
      * 
     * * * * 
      * 
      * * 
       * 

내가 구현해야하는 기능이있다 출력 되나 공백이 없어집니다. 어떻게 해결할 수 있습니까?

+1

@ c650 어떤 힌트가 나와 나를 시작할 수 있습니까? – user2896120

+0

그것은 2의 힘이어야한다고 말합니다. 그래서 여러분은 아마도'pattern (outs, n-1, i + 1);을 잘못 생각하고있을 것입니다. – Charles

+0

StackOverflow에 오신 것을 환영합니다. 도움말 설명서의 게시 지침을 읽고 따르십시오. [최소한의 완전하고 검증 가능한 예제] (http://stackoverflow.com/help/mcve)가 여기에 적용됩니다. 코드를 게시하고 정확하게 문제를 설명하기 전까지는 효과적으로 귀하를 도울 수 없습니다. StackOverflow는 코딩 또는 튜토리얼 서비스가 아닙니다. – Prune

답변

1

패턴에 2*N-1 행이 포함되어 있습니다. 나의 접근 방식은 패턴을 두 개의 절반으로 나누는 것이다. 상반부는 N 라인이고, 하반부는 N-1 라인을 갖는다. 하반부는 하나의 행이 적고 추가 공간이 적은 상반부의 복제품입니다 (예 : N/). 이제 상반부에만 패턴을 찾아야합니다.

위의 패턴을 찾으려면 별의 수와 줄 번호가있는 공백 사이의 관계를 찾으십시오.

내가 N=8

LineNumber Stars Spaces 
    1   1  0 
    2   2  0 
    3   1  1 
    4   4  0 
    5   1  2 
    6   2  2 
    7   1  3 
    8   8  0 
    9   1  4 
    10  2  4 
    11  1  5 
    12  4  4 
    13  1  6 
    14  2  6 
    15  1  7 

에 대한 발견은 지금 위의 예를 보면 패턴을 찾을 것입니다 바랍니다. 그렇지 않은 경우 아래 코드로 spaces의 기능을 참조 할 수 있습니다.

#include <iostream> 
#include <cmath> 
using namespace std; 
bool PowerOfTwo(int n) 
{ 
    if ((n&(n-1)) == 0 && n!=1) 
     return true; 
    return false; 
} 
int star(int n) 
{ 
    int i=n,ans=0; 
    while(i%2==0) 
    { 
     i/=2; 
     ans++; 
    } 
    return pow(2,ans); 
} 
int spaces(int n) 
{ 
    if(PowerOfTwo(n)==true) 
     return 0; 
    return (n-1)/2; 
} 
void printpattern(int n) 
{ 
    int i,sp,st; 
    sp = spaces(n); 
    for(i=1;i<=sp;i++) 
     cout<<" "; 
    st = star(n); 
    for(i=1;i<=st;i++) 
     cout<<"* "; 
} 
void pattern(int n) 
{ 
    int i,j,sp; 
    for(i=1;i<=n;i++)    //Upper Half  
    { 
     printpattern(i); 
     cout<<endl; 
    } 
    sp = n/2; 
    for(i=1;i<=n-1;i++)    //Lower Half 
    { 
     for(j=1;j<=sp;j++) 
      cout<<" "; 
     printpattern(i); 
     cout<<endl; 
    } 
} 
int main() 
{ 
    int n=8; 
    pattern(n); 
    return 0; 
} 
관련 문제