Помощь в Паскале - PullRequest
       38

Помощь в Паскале

0 голосов
/ 30 октября 2010

Следующий фрагмент кода печатает треугольник Паскаля, я получил этот фрагмент из Интернета, но не могу получить формулу для bin. Если кто-нибудь может мне помочь с этим, я был бы благодарен \

#include<stdio.h>
int main()
{
    int bin=1,p,q=0,r,x;
    clrscr();
    printf("Rows you want to input:");
    scanf("%d",&r);
    printf("\nPascal's Triangle:\n");
    while(q<r)
    {   
        printf("ROW %d",q);
        for(p=40-3*q;p>0;--p)
        printf(" ");
        for(x=0;x<=q;++x)
        {
            if((x==0)||(q==0))
            bin=1;
            else
            bin=(bin*(q-x+1))/x;
            printf("%6d",bin);
        }
        printf("\n");
        ++q;
    }
    getchar();
    return 0;
}

Ответы [ 2 ]

1 голос
/ 30 октября 2010

Хорошо, давайте посмотрим. Фактическая формула является внутренней для цикла:

    for(x=0;x<=q;++x)
    {
        if((x==0)||(q==0))
          bin=1;
        else
          bin=(bin*(q-x+1))/x;
        printf("%6d",bin);
    }

q представляет строку паскальского треугольника, начинающуюся сверху. х представляет номер элемента в строке. Поскольку в строке 1 будет 1 элемент, в строке 2 два элемента. Так что for(x=0;x<=q;++x) имеет смысл.

теперь к условию if if((x==0)||(q==0)). Если х равен 0, то мы находимся с левой стороны треугольника или начала строки треугольника, которая всегда равна 1. Если q равно 0, то, конечно, это первая строка треугольника (начинающаяся сверху), которая также всегда 1. Так как есть только один элемент.

Теперь перейдем к предложению else, которое, вероятно, является наиболее интересной частью:

    else
      bin=(bin*(q-x+1))/x;

Первый раз, когда мы входим в это предложение, после того, как q было 0 и x было 0 в начале цикла и было установлено в 1. Это важно, поскольку bin был определен вне цикла for и сохраняет значение от итерация к итерации. Итак, теперь x равно 2, а bin равно 1. Снова q представляет номер строки и длину строки. Чтобы понять это, вы должны взглянуть на страницу википедии треугольника Паскаля . Особенно часть с

Расчет отдельной строки или диагональ сама по себе

там вы найдете формулу, записанную снова. Важное слово здесь - факториалы. Также может быть полезна статья о матрице Паскаля 1022 *. Я постараюсь объяснить это, но (я ненавижу, когда кто-то говорит это), вы должны это увидеть. Взгляните на диагонали паскальского треугольника и на внутреннюю часть формулы (q-x+1). Теперь вычислите значения, которые вы всегда получите для каждой диагонали. Вы видите образец? Я надеюсь, что теперь все начинает обретать смысл.

1 голос
/ 30 октября 2010

Выведите значения, которые используются для вычисления bin в цикле, чтобы понять, как он работает

    /* ... */
    else
    {
        printf("new bin=(%d*(%d-%d*1))/%d\n", bin, q, x, x);
        bin=(bin*(q-x*1))/x;
    }
...