Треугольник Паскаля C++

Как только Вы встроили сторонний блок как ресурс, добавьте код для подписки на AppDomain.AssemblyResolve событие текущего домена во время запуска приложения. Это событие стреляет каждый раз, когда подсистеме Fusion CLR не удается определить местоположение блока согласно зондированию (политики) в действительности. В конечном счете обработчик для AppDomain.AssemblyResolve, загрузите ресурс с помощью Assembly.GetManifestResourceStream и подайте его содержание как массив байтов в соответствие Assembly.Load перегрузка. Ниже то, как одна такая реализация могла быть похожей в C#:

AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
{
    var resName = args.Name + ".dll";    
    var thisAssembly = Assembly.GetExecutingAssembly();    
    using (var input = thisAssembly.GetManifestResourceStream(resName))
    {
        return input != null 
             ? Assembly.Load(StreamToBytes(input))
             : null;
    }
};

, где StreamToBytes мог быть определен как:

static byte[] StreamToBytes(Stream input) 
{
    var capacity = input.CanSeek ? (int) input.Length : 0;
    using (var output = new MemoryStream(capacity))
    {
        int readLength;
        var buffer = new byte[4096];

        do
        {
            readLength = input.Read(buffer, 0, buffer.Length);
            output.Write(buffer, 0, readLength);
        }
        while (readLength != 0);

        return output.ToArray();
    }
}

Наконец, поскольку некоторые уже упомянули, , ILMerge может быть другой опцией рассмотреть, хотя несколько более включенный.

8
задан user1118321 5 March 2015 в 14:17
поделиться

3 ответа

Треугольник Паскаля - это, по сути, сумма двух значений, расположенных непосредственно над ним ....

           1
         1   1
       1   2   1
     1   3   3   1

и т. Д.

  • В этом случае единицы получаются путем добавления 1 над ним с пробелом space (0)
  • Для кода все единицы заняты либо в первом столбце (0), либо когда (col == row)

Для этих двух граничных условий мы кодируем в особых случаях (для инициализации ). Основная часть кода (рекурсивная часть) - это фактическая логика.

(Условие 'row == 1' не обязательно)

7
ответ дан 5 December 2019 в 04:32
поделиться

Треугольник Паскаля можно получить, добавив две записи над текущим.

  | 0          1          2          3            column
--+----------------------------------------------
0 | 1 (case 1)
1 | 1 (case 2) 1 (case 2)
2 | 1 (case 3) 2 (sum)    1 (case 4)
3 | 1 (case 3) 3 (sum)    3 (sum)    1 (case 4)

row

и т. Д., Например, столбец 2, строка 3 = столбец 2, строка 2 + столбец 1, строка 2, где представлены следующие случаи:

if (row_no == 0) // case 1
{
    return 1;
}
else if (row_no == 1) // case 2
{
    return 1;
}
else if (col_no == 0) // case 3
{
    return 1;
}
else if (col_no == row_no) // case 4
{
    return 1;
}
else // return the sum
    return pascalRecursive(height-1,width)+pascalRecursive(height-1,width-1);
2
ответ дан 5 December 2019 в 04:32
поделиться

Вот как работает рекурсия

We call v(i, j), it calls v(i - 1, j), which calls v(i - 2, j) and so on, 
until we reach the values that are already calculated (if you do caching), 
or the i and j that are on the border of our triangle.

Then it goes back up eventually to v(i - 1, j), which now calls v(i - 2, j - 1), 
which goes all the way to the bottom again, and so on.   

....................................................................
                  _ _ _ _ call v(i, j) _ _ _ _ _
                 /                              \ 
                /                                \
               /                                  \   
           call v(i - 1, j)                     v(i - 1, j - 1)
         /                 \                   /               \
        /                   \                 /                 \
 call v(i - 2, j)  v(i - 2, j - 1)    v(i - 2, j - 1)    v(i - 2, j - 2)
....................................................................

Если вам нужно часто получать значение и если у вас достаточно памяти:

class PascalTriangle
  # unlimited size cache

  public 

  def initialize
    @triangle = Array.new  
  end

  def value(i, j)
    triangle_at(i, j)
  end

  private

  def triangle_at(i, j)
    if i < j
      return nil 
    end

    if @triangle[i].nil?        
      @triangle[i] = Array.new(i + 1)
    else
      return @triangle[i][j]
    end

    if (i == 0 || j == 0 || i == j)
      @triangle[i][j] = 1
      return @triangle[i][j]
    end

    @triangle[i][j] = triangle_at(i - 1, j) + triangle_at(i - 1, j - 1)
  end
end
1
ответ дан 5 December 2019 в 04:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: