Что не так с треугольником моего паскаля? - PullRequest
2 голосов
/ 16 декабря 2011

Недавно я искал несколько простых проблем с кодированием и обнаружил треугольник Паскаля ( здесь ), и я сам попытался сгенерировать его в C / Objective-C. Для тех, кто не знает, что это такое, эта ссылка объясняет это очень хорошо.

Я начинаю испытывать странность после четвертого ряда и просто не могу понять, почему.

Мой вывод за 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). Фактическая логика происходит в основном во втором цикле. В третьем цикле значения объединяются и форматируются в строку.

Я прокомментировал этот код гораздо больше, чем для себя, чтобы улучшить читаемость.

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];

У меня такое чувство, что проблема может быть связана со смещением, но я не знаю, как это исправить. Если кто-то может определить, где мой код работает неправильно, это было бы здорово.

1 Ответ

1 голос
/ 16 декабря 2011

Похоже (из краткого обзора), что исходное вычисление средней точки неверно.Я думаю, что это должно быть просто:

mid = iterations - 1;

В примере с 5 итерациями средняя точка должна находиться в позиции массива 4. Каждая итерация «перемещает» еще одну позицию влево.2-я итерация (2-я строка) будет помещать 1 в позиции 3 и 5. 3-я итерация в 2 и 6. 4-я в 1 и 7. И 5-я и последняя итерация заполнит 1 в 0 и 8.1004 *

Кроме того, второй оператор if для временного добавления должен выглядеть следующим образом, в противном случае он читает за пределами границ массива:

if (chi < iterations - 1) {
...