Ответы пользователя по тегу Алгоритмы
  • Как найти все возможные комбинации чисел от 1 до n-1 чтобы их сумма была равна n?

    john36allTa
    @john36allTa
    alien glow of a dirty mind
    на маленьких работает, на больших проверить возможности нет
    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');
    Ответ написан
  • Как осуществить алгоритм поиска Фибоначчи?

    john36allTa
    @john36allTa
    alien glow of a dirty mind
    Оптимизированная версия поиска в обе стороны
    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);
    	}
    }
    Ответ написан
  • Как лучше организовать структуру данного кода?

    john36allTa
    @john36allTa
    alien glow of a dirty mind
    Если действия нельзя как то сгруппировать по условиям, то if ... else пожалуй лучшая конструкция для js.
    Ответ написан
    Комментировать
  • Какой алгоритм составить для подбора количества банок?

    john36allTa
    @john36allTa
    alien glow of a dirty mind
    Пример простой реализации(есть недочёты) на JS, но можно адаптировать на любой в принципе..
    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] - эти остались
    Ответ написан
    Комментировать
  • Как решить задачу итеративным процессом?

    john36allTa
    @john36allTa
    alien glow of a dirty mind
    // Опишем вашу функцию как есть
    // 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')


    upd: если функция f(n) = f(n-1) + f(n-2) + f(n-3)
    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]
      }
    Ответ написан