11.11.2015, 16:59
|
Новичок на форуме
|
|
Регистрация: 11.11.2015
Сообщений: 4
|
|
Каждое четвертое число это сумма первых трех
Как написать рекурсию которая бы показывала число по порядковому номеру, учитывая что на входе у нас - 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')));
Еще одна просьба, не пишите пожалуйста решение, я прошу лишь о маленькой подсказке, а то я завис с этим вопросом.
Последний раз редактировалось korbok, 11.11.2015 в 17:06.
|
|
11.11.2015, 17:46
|
|
Профессор
|
|
Регистрация: 15.01.2015
Сообщений: 622
|
|
Сообщение от korbok
|
Учитывая то, что бы программа не запоминала все значения до этого числа.
|
Т.е. вы считаете возможным посчитать число по порядковому номеру зная только сам порядковый номер и зависимость числа от предыдущих трёх чисел?
|
|
11.11.2015, 17:58
|
Новичок на форуме
|
|
Регистрация: 11.11.2015
Сообщений: 4
|
|
Если быть откровенным, то слегка не представляю это, но такова поставленная задача. Да и возможно же сделать так что бы переменные сами себя заменяли на новое значение. Ведь нужно считать только три цифры которые стоят перед заветным параметром, до тех пор, пока не получится этот самый параметр. Я очень новичок в этом всем деле, но есть некоторые домыслы. Что если создать переменную которая бы временно хранила значение которое нужно передать дальше ?
То есть:
a + b + c = d
a = b
b = c
c = d
Вот что то типа такого. Но ведь если так сделать то все переменные приобретут одно значение.
Ну или хотя бы добиться того, то бы отсчет начинался с 0, а не с 1 ?
|
|
11.11.2015, 18:24
|
|
Профессор
|
|
Регистрация: 15.01.2015
Сообщений: 622
|
|
Сообщение от korbok
|
То есть:
a + b + c = d
a = b
b = c
c = d
|
так возможно сделать и весьма просто. Напишите на бумаге и вы быстро найдёте ответ (если ещё не нашли )
|
|
11.11.2015, 18:25
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,124
|
|
korbok,
сначала нужна функция которая запомнит три числа и вернёт функцию обработки в которой и будет рекурсия
|
|
11.11.2015, 18:41
|
Новичок на форуме
|
|
Регистрация: 11.11.2015
Сообщений: 4
|
|
Сообщение от EmperioAf
|
так возможно сделать и весьма просто. Напишите на бумаге и вы быстро найдёте ответ (если ещё не нашли )
|
Вот в том то и беда. Я уже пишу даже в душе, на зеркале, решение, вот оно, под носом, но как то ускользает.
Приведу пример того что я писал и оно не работает.
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')));
|
|
11.11.2015, 18:43
|
Новичок на форуме
|
|
Регистрация: 11.11.2015
Сообщений: 4
|
|
Сообщение от рони
|
korbok,
сначала нужна функция которая запомнит три числа и вернёт функцию обработки в которой и будет рекурсия
|
То есть, если я правильно понял. Вы имеет ввиду написать функцию, которая бы хранила в себе исходные числа (0 1 2), а затем написать функцию с рекурсией, в которой бы эта функция участвовала в суммировании ?
|
|
11.11.2015, 19:11
|
|
Профессор
|
|
Регистрация: 15.01.2015
Сообщений: 622
|
|
не может быть что до вас не доходит такой простой расчёт
<!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
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,124
|
|
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
|
|
|
|