Как я могу вычислить число в данной строке и столбце в треугольнике Паскаля?

Я пытаюсь создать функцию, которая, учитывая строку и столбец, будет вычислять значение в этой позиции в треугольнике Паскаля.

Пример:

val = GetPasVal(3, 2); // returns 2

Итак, здесь я указываю строку 3, столбец 2, который, как вы можете видеть:

          1
         1  1
       1   2   1

... должно быть 2.


person user2205090    schedule 24.03.2013    source источник
comment
Хороший пример треугольника Паскаля вы можете найти по адресу: треугольник Паскаля   -  person Daniil    schedule 24.03.2013
comment
Эм. Вам нужно улучшить качество ваших вопросов. Ваша, история вот, ..., интересная.   -  person Sebastian Mach    schedule 27.03.2013
comment
stackoverflow.com/questions/16709748   -  person cristicbz    schedule 02.06.2013


Ответы (5)


Треугольник Паскаля содержит биномиальные коэффициенты C(n,k); Существует очень удобная рекурсивная формула

C(n, k) = C(n-1, k-1) + C(n-1, k)

Вы можете использовать эту формулу для расчета биномиальных коэффициентов.

person Armen Tsirunyan    schedule 24.03.2013
comment
Извините, но я не понял :( не могли бы вы показать мне код, пожалуйста? - person user2205090; 24.03.2013
comment
@user2205090: user2205090: Вы действительно удосужились взглянуть на ссылку на Википедию, которую я дал? См. последний раздел. - person Armen Tsirunyan; 24.03.2013
comment
Я бы использовал обычную прямую формулу, приведенную в разделе #Multiplicative Formula в той же статье. . Может быть легко реализован с помощью одного или двух циклов for. Решите, хотите ли вы использовать арифметику с целым числом или с плавающей запятой для вычисления. У них разные ограничения. - person Jeppe Stig Nielsen; 24.03.2013
comment
@JeppeStigNielsen: проблема с мультипликативной формулой заключается в том, что промежуточные результаты могут не храниться в вашем целевом типе, тогда как окончательный результат сохраняется. Это требует дополнительного ухода. - person Armen Tsirunyan; 24.03.2013
comment
Соглашаться. Вероятно, вам следует использовать формулу C(n, k) == ( n*(n-1)*(n-2)*... )/( k*(k-1)*(k-2)*... ), где и числитель, и знаменатель имеют k множителей. Если сначала вычислить весь числитель с целочисленным типом (возможно, BigInteger) с помощью цикла for, то конечное деление будет точным. - person Jeppe Stig Nielsen; 25.03.2013
comment
Теперь я нашел сообщение в блоге Вычислить биномиальный коэффициент N, эффективно выбрать K в C#, где они отмечают, что если взять произведение (n/k) * ((n-1)/(k-1)) * ((n-2)/(k-2)) * ...k факторами) и оценить его справа (назад ), то каждый результат на этом пути будет точным целым числом. Так что красиво. Рекурсивный метод, конечно, тоже красивый и очень короткий, но я не знаю, насколько хорошо среда выполнения справится с ним для больших значений n. - person Jeppe Stig Nielsen; 25.03.2013
comment
@JeppeStigNielsen: если запоминание используется вместе с рекурсией, рекурсивная формула работает очень хорошо. - person Armen Tsirunyan; 25.03.2013
comment
Этот пост в блоге эквивалентен рекурсивной формуле C(n, k) == C(n-1, k-1) * n / k, в которой также используются целые числа, и которая является однократно рекурсивной формулой, где C(·, ·) появляется только один раз в правой части. - person Jeppe Stig Nielsen; 25.03.2013
comment
@JeppeStigNielsen: Опять же, проблема в том, что, поскольку либо n, либо C(n-1, k-1) не обязательно делится на k, вам придется сначала умножить C(n-1, k-1) на n а затем определить результат через k. По произведению может переполниться, тогда как после деления получится красивое целое число, подходящее под ваш тип. - person Armen Tsirunyan; 25.03.2013
comment
Всем спасибо, но я так и сделал: int get_pascal(const int row_no,const int col_no) { if (row_no == 0 || row_no == 1 || col_no == 0 || col_no == row_no) { return 1; } return(get_pascal(row_no-1,col_no-1)+get_pascal(row_no-1,col_no)); } и это работает.. - person user2205090; 25.03.2013
comment
@ user2205090: Хорошо, вы использовали рекурсивную формулу. Это не очень эффективно, если вы не сохраните все промежуточные результаты (например, в двумерном массиве) и не будете пересчитывать одно и то же снова и снова. - person Armen Tsirunyan; 25.03.2013

Используя уравнение Армена, рекурсивный код для реализации треугольника Паскаля будет выглядеть следующим образом:

using System;
using System.Collections.Generic;

public class Program
{
  public void Main()
   {        
    for(int i =0 ; i<5;i++)
    {
        int sum = 1;
        Console.WriteLine();
        for(int j =0 ; j<=i;j++)
        {
            Console.Write(pascal(i,j));
            //Console.Write(sum); //print without recursion
            sum= sum *(i-j) / (j + 1);              
        }
    }           
}

  public int pascal(int x, int y)
  {
    if((x+1)==1 || (y+1)==1 || x==y)
    {
        return 1;
    }
    else
    {
        return pascal(x-1,y-1)+ pascal(x-1,y);
    }
  }
}
person Pratik    schedule 26.02.2014

В «Комбинациях» есть формула для определения значения в любом месте треугольника Паскаля:

Обычно он называется n choose k и пишется так:

n choose k = n! / k!(n-k)!

Обозначение: n choose k также может быть записано как C(n,k), nCk.

static void Main(string[] args)
{
    var x = GetPasVal(3, 2);
    Console.WriteLine(x);
}

public static long GetPasVal(int row, int col)
{
    int factOfRow = 1,i;
    for(i = 1;i<=(row - 1);i++)
        factOfRow *= i;
    int factOfRowMinusCol = 1;
    for(i = 1;i<=(row - 1)- (col - 1);i++)//check out below link to understand condition 
         factOfRowMinusCol *= i;
    int factOfCol = 1;     
    for(i = 1;i<= (col - 1);i++)
        factOfCol *=i;   
    int fact = factOfRow / (factOfCol * factOfRowMinusCol);
    return fact;
}

https://www.mathsisfun.com/pascals-triangle.html

person grishma shah    schedule 03.05.2018

for row in range(10):
print('{: ^45}'.format(' '.join(str(pascal(row, col)) for col in range(row+1))))

Используйте приведенный выше код, чтобы распечатать треугольник Паскаля и тем самым изменить код. Первые 10 должны выглядеть так:

                  1
                 1 1                     
                1 2 1                    
               1 3 3 1                   
              1 4 6 4 1                  
            1 5 10 10 5 1                
          1 6 15 20 15 6 1               
         1 7 21 35 35 21 7 1             
       1 8 28 56 70 56 28 8 1            
     1 9 36 84 126 126 84 36 9 1         
person narcissus789    schedule 16.11.2016

Метод GetPasVal вычислит все числа в треугольнике Паскаля до точки, которую вы укажете (высота), и после этого метод вернет значение индекса в этой строке (ширина). Это то, что вы можете использовать. Это довольно просто. Вам просто нужно использовать зубчатый массив.

    static void Main(string[] args)
    {
        var x = GetPasVal(3, 2);
        Console.WriteLine(x);
    }

    public static long GetPasVal(int height, int width)
    {
        long[][] triangle = new long[height][];
        for (int i = 0; i < height; i++)
        {
            triangle[i] = new long[i + 1];
            triangle[i][0] = 1;
            triangle[i][i] = 1;
            if (i >= 2)
            {
                for (int j = 1; j < i; j++)
                {
                    triangle[i][j] = triangle[i - 1][j - 1] + triangle[i - 1][j];
                }
            }
        }
        return triangle[height - 1][width - 1];
    }
person VG98    schedule 28.01.2018