Комментарии 36
Начинать с двух точек много, чтобы разобраться в кривых разного порядка лучше начинать с 1 точки. Так нагляднее. Верхнее ограничение тоже забавно — неужели есть необходимость разбираться с такими сложными кривыми? Если по фану, то сделали бы 100 — красивые штуки хоть получались бы — например развязку в Москве нарисовать можно было бы.
+1
private int Factorial(int i)
{
int ret = 1;
while (i > 1) ret *= i--;
return ret;
}
Красивее так:
private int Factorial(int i)
{
if (i == 0) return 1;
return i * Factorial(i--);
}
Извините за занудство.
-3
спорный вопрос. бытует мнение, что несколько выходов (aka return) из функции не есть комильфо, посему через переменную как-то правильнее. тем более ваш вариант с рекурсией, совсем уж извращенство. хочется «красоты», в этом смысле, используйте лямбда выражения :)
0
Ну с несколькими ретурнами — это тема для холиваров. Я чаще встречаю людей, кто так не считает, чем кто так считает. Вроде, это устаревшее мнение, берущее корни из Паскаля в силу определённых нюансов.
+2
Как мне кажется, функциональное программирование действительно красиво. А лямбда — это еще не ФП. Зато представленный пример с рекурсией как раз «в духе» ФП. И уж никак не извращенство.
0
тогда уж:
private int Factorial(int i)
{
return i == 0 ? 1 : i * Factorial(i-1);
}
+11
Соглашусь с вышесказанным, рекурсия для такой простой задачи — как-то не к месту, что ли.
Зачем усложнять тривиальные вещи? Пожалейте stack :)
Зачем усложнять тривиальные вещи? Пожалейте stack :)
+2
В данном случае вообще нет необходимости считать факториал, можно забить табличку от 0 до 20, 21! уже не влезет в int64.
+2
Так и сделано, при выборе количества точек биномиальный коэффициент для них вычисляется один раз и заносится в табличку. Откуда при расчетах и берется. Конечно можно совсем статически табличку забить, но это немного усложнит расчет и сделает его менее читабельным, а на производительность не повлияет.
+1
Если среда выполнения поддерживает «хвостовую рекурсию», то stack чувствует себя очень хорошо при подобных вариантах. Да и скорость не хуже.
А запись через рекурсию более точно подходит под математическое определение факториала.
Так почему бы не записать так, чтоб понятно было даже «доменному специалисту» (в данном случае — математику)? :)
А запись через рекурсию более точно подходит под математическое определение факториала.
Так почему бы не записать так, чтоб понятно было даже «доменному специалисту» (в данном случае — математику)? :)
0
Зачем усложнять тривиальные вещи?
Зачем усложнять тривиальные вещи, если можно использовать рекурсию вместо цикла? ;)
Имхо, всему своё место.
0
Написал специально без рекурсии, на случай расширения, чтобы в будущем стек не забивать)
0
Вот только ваш код не работает.
0
Ваш вариант не содержит хвостового вызова и потому в языках с его оптимизацией оптимизирован не будет
А в .Net (точнее в C#) лучше рекурсию не использовать вовсе, поскольку там нет оптимизации хвостовых вызовов на уровне компилятора. Хотя в CLR инструкция все же присутсвует. Хотя может со времен .NET 3.5 что-то изменилось, честно не в курсе.
Хотя применительно в данному примеру это неважно, поскольку здесь не такая большая глубина, чтобы заметить разницу или получить StackOwerflow
А в .Net (точнее в C#) лучше рекурсию не использовать вовсе, поскольку там нет оптимизации хвостовых вызовов на уровне компилятора. Хотя в CLR инструкция все же присутсвует. Хотя может со времен .NET 3.5 что-то изменилось, честно не в курсе.
Хотя применительно в данному примеру это неважно, поскольку здесь не такая большая глубина, чтобы заметить разницу или получить StackOwerflow
0
private static Int64 Factorial(int n)
{
// Due to Int64 limits
if (n > 20)
{
throw new ArgumentException("Factorial parameter can not be greater than 20.", "n");
}
if (n == 0)
{
return 1;
}
Int64 result = 1;
for (int i = 1; i <= n; i++)
{
result *= i;
}
return result;
}
0
ifolder? Неужели не существует нормальных файл-хостингов?
+3
Если знаете лучше, дайте линк. ifolder пока не подводил.
-2
Смотреть рекламу и ждать чтобы скачать файл — это нормально? Используйте zalil.ru или rghost.
+5
Довыложил:
zalil.ru/30386914
zalil.ru/30386914
+1
По этой причине я передумал качать файл))
0
Честно говоря не вижу причины не создать проект на том же code.google.com — сорсы залить в Mercurial, а откомпилинную версию в Downloads
Имхо не намного сложнее чем на всякие файло-помойки, зато возможностей намного больше.
Имхо не намного сложнее чем на всякие файло-помойки, зато возможностей намного больше.
+1
у вас нет дропбокса? а в дропбоксе нету шары?
-1
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Рисуем многочлен Бернштейна для произвольного числа опорных точек