2013-09-27 2 views
0

Edit: Correction Code (Merci pour les réponses et aider!)C++ Recursion Impression de caractères

#include <iostream> 
using namespace std; 

int arr1(const int n,int i, int j){ 
    if(j != 0) { 
    /* if(i == 2*n){ 
    cout<<"\n"; 
    --j;}*/ 
    if((i <= (n-j) || (i >= (j+n)) && i <2*n)){ 
    cout<<" "; 
    } 
    if(i < n && i > (n-j)){ 
    cout<<"\\"; 
    } 
    if(i > n && i < (n+j)){ 
    cout<<"/"; 

    } 
    if(i == n){ 
    cout<<"v"; 

    } 
    if(i == 2*n){ 
    cout<<"\n"; 
    i = 0; 
    --j;} 
    return arr1(n,++i,j); 

} 
    return 0; 
} 

    int main(){ 
    int c; 
    cin>>c; 
    arr1(c,1,c); 

    } 

Je suis en train d'écrire un programme qui prend un entier n et imprime récursive un design de type pointe de flèche

n=1 -> v 
n=2 -> \v/ 
     v 

n=3 -> \\v// 
     \v/ 
      v 

etc:

Ceci est mon code jusqu'à présent, mais je continue à avoir une erreur de segmentation. Je suppose cela à cause d'une boucle infinie quelque part dans le code.

#include <iostream> 
using namespace std; 

int arr1(const int n, int i, int j) 
{ 
    if (j != 0) 
    { 
     if (i == 2 * n) 
     { 
      cout << "\n"; 
      --j; 
     } 
     if (i <= n - j || i >= j + n) 
     { 
      cout << "_"; 
     } 
     if (i < j) 
     { 
      cout << "\\"; 
     } 
     if (i > j) 
     { 
      cout << "/"; 

     } 
     if (i == n) 
     { 
      cout << "v"; 

     } 
     return arr1(n, ++i, j); 

    } 
    return 0; 
} 

int main() 
{ 
    int c; 

    cin >> c; 
    arr1(c, 1, c); 

    return 0; 
} 
+0

Évidemment, 'j' ne devient jamais nul? Ou du moins pas assez tôt avant d'avoir un débordement de pile dû à une récursion excessive de votre fonction 'arr1'. – lurker

+0

Donc, j'ai ajouté ceci: if (i == 2 * n) { cout << "\ n"; return arr1 (n, 1, - j);} Maintenant, il imprime, mais il y a toujours une erreur de formatage. – user2821771

+0

Pourquoi la diminution de j que j'ai dans le code original que j'ai posté ne change pas la valeur de j? Ma pensée était qu'elle décrémenterait j et atteindrait alors l'étape récursive. une partie de mon problème était aussi que je n'ai pas réinitialisé le compteur après que j ai été changé. – user2821771

Répondre

0

La décision de la récursivité se résume à la valeur de j - mais vous recevez j de main, et ne jamais modifier plus tard à moins i==2*n, en passant exactement la même valeur quand il appelle lui-même récursive. Alors oui, cela conduit à une récursion infinie (en supposant que vous passiez à l'origine une valeur non nulle pour j, de toute façon).

0

logique Vous dans la fonction arr1 est faux, par exemple, si c=3 au début,

les i, j, n valeurs arr1 seront à chaque itération

i = 1 j = 3 n = 3 
i = 2 j = 3 n = 3 
i = 3 j = 3 n = 3 
i = 4 j = 3 n = 3 
i = 5 j = 3 n = 3 
i = 6 j = 2 n = 3 
i = 7 j = 2 n = 3 
i = 8 j = 2 n = 3 
i = 9 j = 2 n = 3 
i = 10 j = 2 n = 3 
i = 11 j = 2 n = 3 

...

puis il va pour toujours jusqu'à ce que le débordement de la pile.