0

編集:修正されたコード(回答とヘルプをありがとう!)

#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);

  }

整数 n を受け取り、再帰的に矢じり型のデザインを出力するプログラムを作成しようとしています。

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

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

等:

これまでのところ私のコードですが、セグメンテーション エラーが発生し続けています。これは、コードのどこかに無限ループがあるためだと思います。

#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;
}
4

2 に答える 2

0

関数のロジックarr1が間違っています。たとえば、c=3最初に、

の i、j、n の値はarr1各反復に含まれます

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

...

その後、スタックがオーバーフローするまで永遠に続きます。

于 2013-09-27T02:36:24.917 に答える
0

再帰するかどうかの決定は、 -- の値に帰着しますが、からj受け取って、それ自体を再帰的に呼び出すときにまったく同じ値を渡す場合を除き、後で変更することはありません。そうです、それは無限再帰につながります(とにかく、最初に にゼロ以外の値を渡すと仮定します)。jmaini==2*nj

于 2013-09-27T02:30:05.560 に答える