Files

134 lines
6.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
id: 598eef80ba501f1268170e1e
title: Послідовність n-крокових чисел Фібоначчі
challengeType: 5
forumTopicId: 302267
dashedName: fibonacci-n-step-number-sequences
---
# --description--
Ця серія чисел є розширенням звичайної [послідовності Фібоначчі](https://rosettacode.org/wiki/Fibonacci sequence "Fibonacci sequence") де:
<ol>
<li>Для $n = 2$ ми маємо послідовність Фібоначчі; з початковими значеннями $[1, 1]$ і $F_k^2 = F_{k-1}^2 + F_{k-2}^2$</li>
<li>Для $n = 3$ ми маємо послідовність трібоначчі; з початковими значеннями $[1, 2]$ і $F_k^3 = F_{k-1}^3 + F_{k-2}^3 + F_{k-3}^3$</li>
<li>Для $n = 4$ маємо послідовність тетраначчі; з початковими значеннями $[1, 2, 4]$ та $F_k^4 = F_{k-1}^4 + F_{k-2}^4 + F_{k-3}^4 + F_{k-4}^4$...</li>
<li>Для загального $n>2$ ми маємо послідовність Фібоначчі $n$-крокову - $F_k^n$; з початковими значеннями з перших $n$ значень $(n-1)$'th $n$-крокової послідовності Фібоначчі $F_k^{n-1}$; і $k$'th значення цієї $n$'ої послідовності - $F_k^n = \sum_{i=1}^{(n)} {F_{k-i}^{(n)}$</li>
</ol>
Для невеликих значень $n$, <ahref="https://en.wikipe[іноді використовують грецькі числівникові префікси](https://en.wikipedia.org/wiki/Number prefix#Greek_series "wp: Number prefix#Greek_series") щоб індивідуально дати назву кожній послідовності.
Послідовність $n$- крокових чисел Фібоначчі:
| $n$ | Назва послідовності | Значення |
| --- | ------------------- | ------------------------------------------------------ |
| 2 | фібоначчі | 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 ... |
| 3 | трібоначчі | 1 1 2 4 7 13 24 44 81 149 274 504 927 1705 3136 ... |
| 4 | тетрабоначчі | 1 1 2 4 8 15 29 56 108 208 401 773 1490 2872 5536 ... |
| 5 | пентаначчі | 1 1 2 4 8 16 31 61 120 236 464 912 1793 3525 6930 ... |
| 6 | гексаначчі | 1 1 2 4 8 16 32 63 125 248 492 976 1936 3840 7617 ... |
| 7 | гептаначчі | 1 1 2 4 8 16 32 64 127 253 504 1004 2000 3984 7936 ... |
| 8 | октоначчі | 1 1 2 4 8 16 32 64 128 255 509 1016 2028 4048 8080 ... |
| 9 | нонаначчі | 1 1 2 4 8 16 32 64 128 256 511 1021 2040 4076 8144 ... |
| 10 | деканаччі | 1 1 2 4 8 16 32 64 128 256 512 1023 2045 4088 8172 ... |
Союзні послідовності можна створити там, де початкові значення змінюються: [Послідовність Люка](https://en.wikipedia.org/wiki/Lucas number "wp: Lucas number") сумує два попередніх значення, так само як серія Фібоначчі для $n= 2$, але використовує рядок $\[2, 1]$ як початкові значення.
# --instructions--
Напишіть функцію для створення послідовностей $n$-крокових чисел Фібоначчі та послідовностей Люка. Перший параметр буде $n$. Другий параметр - це кількість елементів, які будуть повернені. Третій параметр визначає чи виводити послідовність Фібоначчі чи послідовність Лукаса. Якщо параметр є `"f"`, то поверніть послідовність Фібоначчі і якщо він `"l"`, то поверніть послідовність Лукаса. Послідовності необхідно повернути у вигляді масиву.
# --hints--
`fib_luc` має бути функцією.
```js
assert(typeof fib_luc === 'function');
```
`fib_luc(2,10,"f")` має повернути `[1,1,2,3,5,8,13,21,34,55]`.
```js
assert.deepEqual(fib_luc(2, 10, 'f'), ans[0]);
```
`fib_luc(3,15,"f")` має повернути `[1,1,2,4,7,13,24,44,81,149,274,504,927,1705,3136]`.
```js
assert.deepEqual(fib_luc(3, 15, 'f'), ans[1]);
```
`fib_luc(4,15,"f")` має повернути `[1,1,2,4,8,15,29,56,108,208,401,773,1490,2872,5536]`.
```js
assert.deepEqual(fib_luc(4, 15, 'f'), ans[2]);
```
`fib_luc(2,10,"l")` має повернути `[ 2, 1, 3, 4, 7, 11, 18, 29, 47, 76]`.
```js
assert.deepEqual(fib_luc(2, 10, 'l'), ans[3]);
```
`fib_luc(3,15,"l")` має повернути `[ 2, 1, 3, 6, 10, 19, 35, 64, 118, 217, 399, 734, 1350, 2483, 4567 ]`.
```js
assert.deepEqual(fib_luc(3, 15, 'l'), ans[4]);
```
`fib_luc(4,15,"l")` має повернути `[ 2, 1, 3, 6, 12, 22, 43, 83, 160, 308, 594, 1145, 2207, 4254, 8200 ]`.
```js
assert.deepEqual(fib_luc(4, 15, 'l'), ans[5]);
```
`fib_luc(5,15,"l")` має повернути `[ 2, 1, 3, 6, 12, 24, 46, 91, 179, 352, 692, 1360, 2674, 5257, 10335 ]`.
```js
assert.deepEqual(fib_luc(5, 15, 'l'), ans[6]);
```
# --seed--
## --after-user-code--
```js
const ans = [[1,1,2,3,5,8,13,21,34,55],
[1,1,2,4,7,13,24,44,81,149,274,504,927,1705,3136],
[1,1,2,4,8,15,29,56,108,208,401,773,1490,2872,5536],
[ 2, 1, 3, 4, 7, 11, 18, 29, 47, 76],
[ 2, 1, 3, 6, 10, 19, 35, 64, 118, 217, 399, 734, 1350, 2483, 4567 ],
[ 2, 1, 3, 6, 12, 22, 43, 83, 160, 308, 594, 1145, 2207, 4254, 8200 ],
[ 2, 1, 3, 6, 12, 24, 46, 91, 179, 352, 692, 1360, 2674, 5257, 10335 ]];
```
## --seed-contents--
```js
function fib_luc(n, len, w) {
}
```
# --solutions--
```js
function fib_luc(n, len, w) {
function nacci(a, n, len) {
while (a.length < len) {
let sum = 0;
for (let i = Math.max(0, a.length - n); i < a.length; i++)
sum += a[i];
a.push(sum);
}
return a;
}
if(w=="f"){
return nacci(nacci([1,1], n, n), n, len);
}else{
return nacci(nacci([2,1], n, n), n, len);
}
}
```