Re[31]: Вопрос к Vlad2: Nemerle & R#
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.03.06 23:40
Оценка: -1
Здравствуйте, Oyster, Вы писали:

O>
O>namespace Oyster
O>{
O>  public module Math
O>  {
O>    // Просто метод, который просто считает факториал в рантайме
O>    static public Fact(x : int) : int
O>    {
O>      | 1 => 1
O>      | _ =>
O>        if (x > 1)
O>          x * Fact(x - 1)
O>        else
O>          throw ArgumentException("x")
O>    }
O>  }
O>}
O>


Кстати, раз уж мы говорим о функциональном языке, то факториалы лучше тоже в функциональном стиле описывать:
def Fact(x : uint) : ulong
{
  def Loop(acc : ulong, x : uint)
  {
    if (x <= 1) acc else Loop(acc * x, x - 1)
  };
  
  Loop(1UL, x)
}

WriteLine(Fact(20));

Учитывая не нениальный оптимизатор данный код окажется самым шустрым, так как он использует концевую рекурсию. Компилятор развернет концевую рекурсии и подставить вычисление прямо по месту. Думаю процентов 20% на этом можно выиграть.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.