2

最近、いくつかの簡単なコーディングの課題を探していて、パスカルの三角形 (ここ) について発見し、C/Objective-C で自分で生成しようとしました。それが何であるかわからない人のために、そのリンクはそれをかなりよく説明しています.

4行目以降からおかしくなり始めましたが、その理由がわかりません.

現在、5回の反復の出力は次のようになっています。

   1      
  1 1     
 1 2 1    
1 3 3 1   
 4 6 3 1

次のようになります。

    1
   1 1
  1 2 1
 1 3 3 1
1 4 6 4 1

これまでの私のコードは次のとおりです。最初のループは単なるリセット ループです (すべての値を 0 に設定します)。実際のロジックは、主に 2 番目のループで発生します。3 番目のループでは、値が連結され、文字列にフォーマットされます。

読みやすくするために、このコードには自分自身よりもはるかに多くのコメントを付けました。

int iterations, i, b, mid, chars, temp;
NSLog(@"Please enter the number of itereations");
scanf("%i",&iterations); // take users input and store it in iterations

// calculate where the first 1 should go.
if (iterations % 2 == 0) mid = (iterations)/2;
else mid = (iterations+1)/2;

chars = iterations*2;

int solutions[iterations][chars];

// reset loop
for (i = 0; i<iterations; i++) {
    for (b = 0; b<chars; b++) {
        solutions[i][b] = 0;
    }
}

solutions[0][mid] = 1; // place the initial 1 in first row

for (int row = 1; row<iterations; row++) {
    for (int chi = 0; chi<chars; chi++) {
        temp = 0;
        if (chi > 0) {
            temp += solutions[row-1][chi-1]; // add the one diagonally left
        }
        if (chi < iterations) {
            temp += solutions[row-1][chi+1]; // add the one diagonally right
        }
        solutions[row][chi] = temp; // set the value
    }
}

// printing below...

NSMutableString *result = [[NSMutableString alloc] initWithString:@"\n"];
NSMutableString *rowtmp;

for (i = 0; i<iterations; i++) {
    rowtmp = [NSMutableString stringWithString:@""];
    for (b = 0; b<chars; b++) {
        if (solutions[i][b] != 0) [rowtmp appendFormat:@"%i",solutions[i][b]];
        else [rowtmp appendString:@" "]; // replace any 0s with spaces.
    }
    [result appendFormat:@"%@\n",rowtmp];
}

NSLog(@"%@",result);
[result release];

問題はオフセットに関係している可能性があると感じていますが、修正方法がわかりません。誰かが私のコードが間違っている場所を見つけることができれば、それは素晴らしいことです.

4

1 に答える 1

1

(簡単に見て)元の中間点の計算が正しくないように見えます。私はそれが単にあるべきだと思います:

mid = iterations - 1;

5回の反復の例では、中点は配列位置4にある必要があります。各反復はもう1つの位置を左に「移動」します。次に、2番目の反復(2行目)は位置3と5に1を配置します。3番目の反復は2と6に配置します。4番目は1と7に配置し、5番目と最後の反復は0と8に1を入力します。

また、if一時的な追加の2番目のステートメントは次のようになります。そうでない場合は、配列の境界の終わりを超えて読み取られます。

if (chi < iterations - 1) {
于 2011-12-15T23:38:42.117 に答える