Сообщение от рони
|
вы не могли бы написать формулу на js, по которой можно получить 7, 21, 63?
P.S. формулу написал, но если интересно напишите свой вариант.
|
Математическая формула известна (вспоминаем комбинаторику
)
Количество сочетаний из n элементов по k
(т.е сколькими способами можно выбрать k элементов из n)
C(n,k) = n!/ (k! * (n-k)!)
Сумма C(n,k) k=2...n-1 дает количество вариантов разбиения множества из n элементов на два непустых подмножества.
Отсюда получаем такой счет
<pre>
<script>
// Формирует массив из n элементов
// a[k] - количество вариантов выбора k элементов из n
// a[0] и a[n] = 1
// и считаем сумму a[i] (i=1...n-1)
const nsel = (n) => {
let a = [1, n]; s=n
for (let i=2; i<=n-1; i++) {
a[i] = a[i-1]*(n-i+1)/i
s+=a[i]
}
a[n] = 1;
return [a, s]
}
for (let k=3; k<=10; k++) {
let [a,s] = nsel(k)
document.write(`${k} : ${a} sum = ${s}<br>`)
}
</script>
</pre>
Про лишние циклы.
Я все равно убежден, что [...x] и x.sort() (так же как и forEach, map, reduce...) это все равно циклы.
Хоть они может быть (хотя не факт) и выполняются чуть быстрее, чем явно написанный, но на производительности сказываются.