- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
class Program
{
static void Main()
{
UInt64 num;
Console.WriteLine(num = F(Convert.ToUInt64(Console.ReadLine())));
Main();
}
static UInt64 F(UInt64 number)
{
return number <= 0 ? 1 : number * F(number - 1);
}
}
guest 15.09.2015 13:29 # 0
3_14dar 15.09.2015 15:46 # 0
UInt64 num;
Console.WriteLine(num = F(Convert.ToUInt64(Console.ReadLine()))) ;
Эклипс уже бы матюкнулся наверно
guest 15.09.2015 15:57 # +1
F() вызов рекурсивной функции всё остальное тоже нормально
3_14dar 15.09.2015 16:04 # 0
guest 15.09.2015 16:02 # +1
3_14dar 15.09.2015 16:05 # 0
guest 15.09.2015 16:23 # 0
а рекурсивный вызов Main() это говнокод с переполнением стэка от бесконечной рекурсии
3_14dar 15.09.2015 16:57 # +1
Her 16.09.2015 00:30 # 0
bormand 16.09.2015 05:59 # 0
Кстати, а шарп хвостовую рекурсию оптимизирует?
3_14dar 16.09.2015 07:57 # 0
roman-kashitsyn 16.09.2015 11:08 # 0
Иногда алгоритмы ощутимо проще выразить (и корректно написать с первого раза) хвостовой рекурсией, чем циклом.
vs
3_14dar 16.09.2015 14:32 # +1
roman-kashitsyn 16.09.2015 15:07 # 0
На более сложных примерах профит может быть более заметным. Быстрое возведение в степень: В какой версии проще проверить, что a * b ^ n == const?
3_14dar 16.09.2015 15:20 # 0
guest 18.09.2015 12:47 # +1
pow(1, 1, Int64.MaxValue)
тебе стек распидорасит, а с циклом он хотя-бы не упадёт и вообще
деление тут не нужно
3_14dar 18.09.2015 12:51 # 0
TarasB 18.09.2015 12:52 # 0
roman-kashitsyn 18.09.2015 12:53 # +3
Я вставил деление, чтобы пидар на умножение/деление сдвигами снова не вонял.
> тебе стек распидорасит, а с циклом он хотя-бы не упадёт
Опять умник появился? тред не читай @ комментируй очевидное
Ты обсуждение про tail call recursion optimization читал?
Ну и глубина рекурсии даже в твоём случае не будет больше 64. Алгоритм логарифмический.
3_14dar 18.09.2015 12:54 # −2
TarasB 18.09.2015 14:02 # 0
Переменная-накопитель нужна лишь для нерекурсии.
roman-kashitsyn 18.09.2015 14:06 # +1
Я умышленно написал так, чтобы вменяемый компилятор мог применить tail call recursion optimization и превратить рекурсивный код в цикл.
roman-kashitsyn 16.09.2015 11:01 # 0
На SO говорят, что нет
guest 18.09.2015 12:31 # 0
ну а хули? программисту же, кроме как иль мерджить, делать нехуй
imihajlov 15.09.2015 15:14 # +2
roman-kashitsyn 15.09.2015 15:30 # +1
imihajlov 15.09.2015 15:31 # +1
roman-kashitsyn 16.09.2015 11:13 # +1
stasmarkin 21.09.2015 09:24 # 0
roman-kashitsyn 21.09.2015 11:01 # 0
stasmarkin 21.09.2015 11:20 # 0
roman-kashitsyn 21.09.2015 11:28 # 0
stasmarkin 21.09.2015 12:01 # −1
Типа, функциональщики пушит (нормально) с хвостовой рекурсией или (через жопу) с Enumerable
roman-kashitsyn 21.09.2015 12:10 # 0