Имя: Пароль:
IT
 
Рекурсия. Как подсчитать следующую сумму без цикла?
0 GANR
 
17.12.20
14:28
Как подсчитать следующую сумму без цикла?

a +
a * (a+1) +
a * (a+1) * (a+2) +
a * (a+1) * (a+2) * (a+3) +

...

a * (a+1) * (a+2) * (a+3) * ... * (a+n)

Факториал то легко. А вот такое?
1 GANR
 
17.12.20
14:28
даны a, n
2 Ненавижу 1С
 
гуру
17.12.20
14:30
чем от факториала принципиально отличается?
3 GANR
 
17.12.20
14:33
(2) Так тут сумма же ещё вдобавок. В факториале то всё просто f(n) = n * f(n-1), f(1) = 1.
4 ДенисЧ
 
17.12.20
14:35
g(a, n) = n * g(a, n-1), f(a, 1) = a.

Так?
5 H A D G E H O G s
 
17.12.20
14:35
Ну в цикле и считай
6 GANR
 
17.12.20
14:39
(4) сомневаюсь, проверю позже сверив с результатом который даст цикл
(5) так без цикла хочу
7 Вафель
 
17.12.20
14:41
а как факториал без цикла посчитать?
8 GANR
 
17.12.20
14:41
(7) рекурсией
9 Garykom
 
гуру
17.12.20
14:42
(0) =n!-a!
10 Garykom
 
гуру
17.12.20
14:42
(9) или +
11 del123
 
17.12.20
14:43
функция Фн(Зн, тек, Макс)
    Если Тек = Макс тогда
        возврат Зн + макс;
    иначе
        возврат (Зн + тек) * Фн(Зн, тек + 1, Макс);
    КонецЕсли;
КонецФункции
12 cViper
 
17.12.20
14:43
(0) Гугли Dynamic Programming. Там найдешь ответ на то как это сделать оптимально.
13 del123
 
17.12.20
14:43
Рез = Фн(а,0,н);
14 Garykom
 
гуру
17.12.20
14:44
(10) хотя не, точно -

a+1, a+2,...,a+n
это же смещенный от 1 на a факториал
=(a+n)!-a!
15 Ёпрст
 
гуру
17.12.20
14:44
(8) ты не поверишь..но рекурсия это тоже цикл
16 del123
 
17.12.20
14:45
а, их еще сложить надо
17 del123
 
17.12.20
14:52
Рез = ФнС(а,н,н);

Функция ФнС(Зн, ТекС, Макс)
    Если ТекС = 0 тогда
        возврат Зн;
    иначе
        возврат ФнП(Зн, 0, ТекС) + ФнС(Зн, ТекС-1, Макс);
    КонецЕсли;
КонецФункции

функция ФнП(Зн, текП, Макс)
    Если ТекП = Макс тогда
        возврат Зн + макс;
    иначе
        возврат (Зн + текП) * ФнП(Зн, текП + 1, Макс);
    КонецЕсли;
КонецФункции
18 МихаилМ
 
17.12.20
14:54
19 GANR
 
17.12.20
14:58
(15) верю, неявный цикл. правильнее сказать без использования операторов цикла
20 cViper
 
17.12.20
15:04
public int calculate(int a, int n) {
if(a < 0) {
return 1;
}
return (a + n) * calculate(a + (n - 1))
}
21 Дегенератор идей
 
17.12.20
15:04
функция ф(а,н)
если н=0
возврат а
иначе
  возврат а*н+ф(а,н-1)
конец
22 RomanYS
 
17.12.20
15:29
Что-то все одной функцией пытаются решить и похоже неправильно. По идее если делать две функции, то задача становится элементарной.
23 Garykom
 
гуру
17.12.20
15:34
(22) дык нужна только функция факториала в формуле "(a+n)!-a!"
24 RomanYS
 
17.12.20
15:41
(23) Так явно кривая формула. Вычисли (0.5)!
25 Garykom
 
гуру
17.12.20
15:44
26 RomanYS
 
17.12.20
15:48
(25) Красота! Просто вычисли рекурсией (24)
27 RomanYS
 
17.12.20
15:50
(23) да любые значения подставь, хотя бы (1,1)
28 del123
 
17.12.20
15:51
в 17 рабочий вариант)
29 Ёпрст
 
гуру
17.12.20
15:58
(24) факториал определен только на множестве целый неотрицательных числах
30 RomanYS
 
17.12.20
16:00
(28) может быть. Только "+1" в последней формуле скорее всего ошибка, вероятно правильнее "-1"
31 RomanYS
 
17.12.20
16:02
(29) я в курсе), а вот (0) вполне определена на всех действительных и даже комплексных чисел.
32 Малыш Джон
 
17.12.20
16:20
OMG... Почему минус-то? это ж факториал

A*(A+1)*(A+2)*...*(A+N) = (A+N)!/(A-1)!
33 RomanYS
 
17.12.20
16:37
(32) ага, только придётся расширить понятие факториала на все действительные числа
34 Classic
 
17.12.20
16:53
Функция СуммаФакториалов(А, N, Факториал = 1)
     Если N = 0 Тогда
         Факториал = A;
         Возврат A;
     Конец;
     ПредФакториал = 1;
     ПредШаг = СуммаФакториалов(A, N - 1, ПредФакториал);
     Факториал = ПредФакториал * (A + N);
     Возврат ПредШаг + Факториал
КонецФункции
35 fisher
 
17.12.20
17:25
Функция Ряд(a, N, Знач НомерЭлементаРяда = 0, Знач ПредыдущийЭлементРяда = 1)
    
    НомерЭлементаРяда = НомерЭлементаРяда + 1;
    Если НомерЭлементаРяда > N Тогда
        Возврат 0;
    КонецЕсли;
    
    ТекущийЭлементРяда = ПредыдущийЭлементРяда * (a + НомерЭлементаРяда - 1);
    
    Возврат ТекущийЭлементРяда + Ряд(a, N, НомерЭлементаРяда, ТекущийЭлементРяда);
    
КонецФункции
36 cViper
 
17.12.20
17:33
Опечатался в (20)

public int calculate(int a, int n) {
   if(n < 0) {
      return 1;
   }
   return (a + n) * calculate(a + (n - 1))
}
37 Йохохо
 
17.12.20
17:38
(33) это школа ты чего
38 Йохохо
 
17.12.20
17:38
10й класс
39 RomanYS
 
17.12.20
17:41
(38) ответь на (24) и алгоритм его вычисления рекурсиво
40 fisher
 
17.12.20
17:43
Так на строчку короче:
Функция Ряд(a, N, Знач НомерЭлементаРяда = 1, Знач ПредыдущийЭлементРяда = 1)
    
    Если НомерЭлементаРяда > N Тогда
        Возврат 0;
    КонецЕсли;
    
    ТекущийЭлементРяда = ПредыдущийЭлементРяда * (a + НомерЭлементаРяда - 1);
    
    Возврат ТекущийЭлементРяда + Ряд(a, N, НомерЭлементаРяда + 1, ТекущийЭлементРяда);
    
КонецФункции
41 Classic
 
17.12.20
17:44
(40)

Сообщить(Ряд(1, 0))
42 fisher
 
17.12.20
17:46
(41) 0. Ведь при N=1 должно быть а. Не?
43 Classic
 
17.12.20
17:47
(42) Нет
44 Classic
 
17.12.20
17:47
При N=1 должно быть A + A * (A + 1)
45 fisher
 
17.12.20
17:52
(44) Эта чой-та? И как тогда получить первый элемент ряда? Это же формула ряда?
46 Доктор Манхэттен
 
17.12.20
17:53
(0) Если факториал тебе легко посчитать, то считай через факториал, вот так: n! / a!
47 Classic
 
17.12.20
17:55
(45)
Посмотри последнюю строку в (0)

a * (a+1) * (a+2) * (a+3) * ... * (a+n)


Здесь же очевидно, что при n = 1 будет a*(a+1)
48 Classic
 
17.12.20
17:55
Точнее a+a*(a+1)
49 Доктор Манхэттен
 
17.12.20
17:55
(46) А, не заметил что там еще сумма этого всего. Тогда не пойдет. Думайте сами
50 fisher
 
17.12.20
17:59
(47) Да ради бога.
Тогда так :)
Функция Ряд(a, N, Знач НомерЭлементаРяда = 1, Знач ПредыдущийЭлементРяда = 1)
    
    Если НомерЭлементаРяда > N + 1 Тогда
        Возврат 0;
    КонецЕсли;
    
    ТекущийЭлементРяда = ПредыдущийЭлементРяда * (a + НомерЭлементаРяда - 1);
    
    Возврат ТекущийЭлементРяда + Ряд(a, N, НомерЭлементаРяда + 1, ТекущийЭлементРяда);
    
КонецФункции
51 cViper
 
17.12.20
18:06
(0)А зачем тебе вообще считать это без цикла через рекурсию? Оно ведь памяти больше ест так.
52 педальный трактор
 
17.12.20
19:03
Для n! есть формула Стирлинга. Для твоего цикла по идее можно сделать аналог этой формулы.
53 Конструктор1С
 
17.12.20
19:59
(0) дурной тон использовать рекурсию там, где можно использовать простой цикл
54 RomanYS
 
17.12.20
20:00
(53) задачка явно не прикладная
55 G-Re
 
17.12.20
20:10
(52) Стирлинг это приближение к n! :))
56 ДедМорроз
 
17.12.20
20:58
Сумма(А,Н)=А*(1+Сумма(А+1,Н-1))
Сумма(Х,0)=Х
Как бы рекурсия.
57 RomanYS
 
17.12.20
21:08
(56) Красава! Всё-таки есть решение с одной функцией.
58 Salimbek
 
17.12.20
23:00
(49) Да без проблем
a!/(a-1)!+(a+1)!/(a-1)!+... = [a!+(a+1)!+(a+2)!+...]/(a-1)!
59 GANR
 
18.12.20
14:55
(58) Компьютер дриснет)
60 НЕА123
 
18.12.20
15:17
функция добавить(Эн,Нечто="а")
    Если Зн <=0  ТОгда
    возврат Нечто;
Иначе
Эн=Эн-1;
Нечто = Нечто+ "+" +Нечто+ "*(а+"+Формат(Эн) +")";
      возврат добавить(Нечто,Эн);
КонецЕсли;
конецфункции
ЗЫ при вызове второй параметр не указывать
61 GANR
 
19.12.20
00:17
(56) Реально красавец, четко 1 в 1 результат с моим циклом совпадает.
62 fisher
 
20.12.20
15:25
(56) У меня при Н=2 фигня какая-то получается.
63 DrHiHi
 
27.12.20
15:18
еще можно попробовать асинхронно, но на сколько это практично, то хз
64 Конструктор1С
 
27.12.20
19:24
(54) но учит плохому
65 RomanYS
 
27.12.20
20:06
Ничего плохого в периодическом напряжении мозга не вижу. Просто не рассматривай (0) как задачу по 1С или промышленному программированию, просто математика.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший