|
Рекурсия. Как подсчитать следующую сумму без цикла? | ☑ | ||
---|---|---|---|---|
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С или промышленному программированию, просто математика.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |