Имя: Пароль:
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С или промышленному программированию, просто математика.
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший