Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Каждое четвертое число это сумма первых трех (https://javascript.ru/forum/misc/59449-kazhdoe-chetvertoe-chislo-ehto-summa-pervykh-trekh.html)

korbok 11.11.2015 16:59

Каждое четвертое число это сумма первых трех
 
Как написать рекурсию которая бы показывала число по порядковому номеру, учитывая что на входе у нас - 0 1 2 . К примеру: Нам нужно узнать какое число стоит под номером 5, в данном случае это будет - 6, так как 0(1) 1(2) 2(3) 3(4) 6(5) 11(6). Учитывая то, что бы программа не запоминала все значения до этого числа. Я написал некую функцию, но у неё есть существенные минусы.
1. Она считает от единицы
2. Очень маленький диапазон просчета. Браузер виснет
function summ(n) {
	if (n <= 3) {
		return n
	} else {
		return summ(n - 1) + summ(n - 2) + summ(n - 3);
	}
}
alert(summ(+prompt('Enter the number, bigest than 3')));


Еще одна просьба, не пишите пожалуйста решение, я прошу лишь о маленькой подсказке, а то я завис с этим вопросом.

EmperioAf 11.11.2015 17:46

Цитата:

Сообщение от korbok
Учитывая то, что бы программа не запоминала все значения до этого числа.

Т.е. вы считаете возможным посчитать число по порядковому номеру зная только сам порядковый номер и зависимость числа от предыдущих трёх чисел?

korbok 11.11.2015 17:58

Если быть откровенным, то слегка не представляю это, но такова поставленная задача. Да и возможно же сделать так что бы переменные сами себя заменяли на новое значение. Ведь нужно считать только три цифры которые стоят перед заветным параметром, до тех пор, пока не получится этот самый параметр. Я очень новичок в этом всем деле, но есть некоторые домыслы. Что если создать переменную которая бы временно хранила значение которое нужно передать дальше ?
То есть:
a + b + c = d
a = b
b = c
c = d
Вот что то типа такого. Но ведь если так сделать то все переменные приобретут одно значение.
Ну или хотя бы добиться того, то бы отсчет начинался с 0, а не с 1 ?

EmperioAf 11.11.2015 18:24

Цитата:

Сообщение от korbok
То есть:
a + b + c = d
a = b
b = c
c = d

так возможно сделать и весьма просто. Напишите на бумаге и вы быстро найдёте ответ (если ещё не нашли :) )

рони 11.11.2015 18:25

korbok,
сначала нужна функция которая запомнит три числа и вернёт функцию обработки в которой и будет рекурсия

korbok 11.11.2015 18:41

Цитата:

Сообщение от EmperioAf (Сообщение 395738)
так возможно сделать и весьма просто. Напишите на бумаге и вы быстро найдёте ответ (если ещё не нашли :) )

Вот в том то и беда. Я уже пишу даже в душе, на зеркале, решение, вот оно, под носом, но как то ускользает.
Приведу пример того что я писал и оно не работает.
function summ(a, b, c, n) {
	var d;
	a == b;
	b == c;
	c == d;
	if (n <= 3) {
		return n
	} else {
		return summ(d * n)
	}
}
alert(summ(0, 1, 2, +prompt('Enter the number, bigest than 3')));

korbok 11.11.2015 18:43

Цитата:

Сообщение от рони (Сообщение 395739)
korbok,
сначала нужна функция которая запомнит три числа и вернёт функцию обработки в которой и будет рекурсия

То есть, если я правильно понял. Вы имеет ввиду написать функцию, которая бы хранила в себе исходные числа (0 1 2), а затем написать функцию с рекурсией, в которой бы эта функция участвовала в суммировании ?

EmperioAf 11.11.2015 19:11

не может быть что до вас не доходит такой простой расчёт
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>ГГ</title>
<style>

* {
  margin:0;
  padding: 0;
  outline: none;
}

</style>
</head>
<body>
<textarea name="" id="" cols="30" rows="30"></textarea>

  <script>
  var textarea = document.querySelector('textarea');

var a = 1;
var b = 2;
var c = 3;
var i = 0;
while (i<20) {
  c = a+b+c;
  b = c-a-b;
  a = c-a-b;
  i++;
  textarea.value += a + " " + b + " " + c+"\r\n";

}

  </script>
</body>
</html>

рони 11.11.2015 19:39

korbok, оптимальнее запоминать результат ...
var fn = function() {
    var a = [0, 1, 2];
    return function c(b) {
        if (b >= a.length) {
            var d = a.slice(-3).reduce(function(a, b) {
                return a + b
            });
            a.push(d);
            return c(b)
        }
        return a[b]
    }
}();



alert( [fn(0),fn(1),fn(2),fn(3),fn(4),fn(5),fn(6),fn(7),fn(8)] ); //0,1,2,3,6,11,20,37,68


Часовой пояс GMT +3, время: 00:31.