function* genz( n ){
for ( let i = n-1; i > 1; i--){
let a = n - i;
if (a < i) yield [i,a]
for (let d of [...genz(a)])
if (!d.some(value => value >= a || value >= i)) yield [i, ...d]
}
}
//pretty print
console.log([...genz(13)].map(v=>v.join(' + ')).join('\r\n'), '\r\n');
using System;
public class FibonacciNumber{
private byte index;
private decimal number;
public FibonacciNumber(int i){
if (i <= 0)
i = 0;
this.index = (byte) i;
this.number = i > 0 ? Fibonacci.getNumber(i) : 0;
}
public FibonacciNumber next(){
return new FibonacciNumber(index+1);
}
public FibonacciNumber prev(){
return new FibonacciNumber(index - 1);
}
public int Index {
get {
return (int) index;
}
}
public decimal Number{
get {
return number;
}
}
}
public class Fibonacci
{
private static double A = Math.Pow(5, 0.5);
private static double B = (A + 1) / 2;
private static double LNb = Math.Log(B);
public static int getIndex(decimal number){
return (int) Math.Round(Math.Log((double)((decimal) Fibonacci.A * number)) / Fibonacci.LNb);
}
public static decimal getNumber(int n){
return (decimal) Math.Round( Math.Pow(Fibonacci.B, n) / Fibonacci.A );
}
public static FibonacciNumber find(decimal number){
return new FibonacciNumber(Fibonacci.getIndex(number));
}
}
public class Program
{
public static void Main()
{
FibonacciNumber fib = Fibonacci.find(100000);
Console.WriteLine(fib.Index);
Console.WriteLine(fib.Number);
Console.WriteLine(fib.next().Number);
}
}
function wrap(liquid, cans){
let result = []
cans = cans.sort((a,b) => b - a)
//сортируем все банки по убыванию объёма
while(cans.length && liquid - cans[0] >= 0){
//пока есть пустая банка и её объём
//не превышает объём оставшийся краски
liquid -= cans[0]
//вычитаем объём банки
result.push(cans.splice(0,1)[0])
//выдираем банку из исходного массива
//и ложим в результирующий
}
while ( liquid > 0 ){
//пока ещё есть краска
cans = cans.sort((a,b) => Math.abs(liquid-b) - Math.abs(liquid-a))
//сортируем по принципу:
//самой последней должна быть банка,
//объём которой ближе объёму оставшейся краски
liquid -= cans[cans.length - 1]
//вычитаем объём банки
result.push(cans.pop())
//выдираем банку из исходного массива
//и ложим в результирующий
}
return result
}
let emptyCans = [15,7,10,12,10]
console.log(wrap(33,emptyCans))
//[15, 12, 7] - эти банки использованы
console.log(emptyCans)
//[10,10] - эти остались
// Опишем вашу функцию как есть
// f(n) = f(n - 1) + f(n - 2) + ... + f(n-n)
const f = n => {
if (n < 3) return n
for ( var i=1, x = 0; i <= n; i++ )
x += f(n-i)
return x
}, // смотрим 10 результатов вычислений и видим ярковыраженную последовательность
//Понимая что итерации здесь избыточны, выводим формулу:
fn = n => n < 4 ? n : 3 * (2 ** (n-3))
// проверяем
let i = 1;
while (++i < 1000)
if (f(i) !== fn(i))
throw new Error('Where is my mind? %`')
console.log('finished')
var numbers = [0,1,2], // кэш чисел для оптимизации повторных вычислений
f = n => {
for (let i = numbers.length; i <= n; i++)
numbers.push(numbers[i-1] + numbers[i-2] + numbers[i-3])
return numbers[n]
}