Теперь Кью работает в режиме чтения

Мы сохранили весь контент, но добавить что-то новое уже нельзя

Могли бы решить следующую задачу (описание ниже)?

Ученик к моменту начала обучения не знает ни одного слова. В первый день занятий он выучил 5 английских слов. В каждый последующий день он выучил на 2 слова больше, чем в предыдущий. Через сколько дней он будет знать не менее n английских слов?
Напишите функцию englishWords, которая принимает в качестве аргумента неотрицательное число n (n>=0)(количество английских слов, которые хочет выучить ученик) и возвращает количество дней, которые необходимы для изучения n слов.
Домашние заданияРешение задач+1
Никита Баев
  ·   · 24,9 K
Веб-разработчик, геймер, специалист по этике  · 20 дек 2021
Вообще это настолько простое классическое домашнее задание по программированию, что очевидное решение я даже рассматривать не буду. Вы принесёте себе огромную пользу, если решите эту задачу сами. Однако, меня заинтересовала одна деталь.
Эта задача включает в себя такую интересную вещь, как рекуррентное соотношение, так как в каждый день ученик изучает количество слов, зависящее от того, сколько он изучил в предыдущий день. На каждой итерации цикла мы зависим от результата предыдущей итерации.
Интересны такие формулы тем, что в некоторых случаях, в том числе и в этом, такие задачи можно решить аналитически, то есть, вывести точную формулу, которая по заданному входному значению вычислит результат, грубо говоря, "в одно действие".
Для тех, кому лень читать мой вывод, искомая конечная функция выглядит так:
function englishWords(n) {
  return Math.ceil(-2 + Math.sqrt(4 + n));
}
Я не рекомендую показывать это решение преподавателю, если только вы не готовы повторить ему мой вывод этого решения.
Я выводил по-старинке, на бумажке, но потом проверил себя через Wolfram Alpha, так что даже покажу скриншоты.
Итак, перепишем формально наши правила, по которым ученик учит слова. На первый день он учит 5 слов, на любой другой день он учит столько, сколько на предыдущий, плюс два. Назовём функцию w, её параметр d:
w(1) = 5
w(d) = w(d-1) + 2
На всякий случай уточню, что я сейчас пользуюсь языком под названием "математическая нотация".
Эти две строчки и есть рекуррентное соотношение, которое я упоминал. Хочется превратить эти две строчки в одну.
Возьмём какое-нибудь значение d и подставим в формулу:
w(4) = w(3) + 2 = w(2) + 2+2 = w(1) + 2+2+2 = w(1) + 3∙2
Если достаточно долго смотреть на это разложение в ряд, в конце концов замечаем, что:
w(d) = w(1) + 2(d-1) = 5 + 2d - 2 = 2d + 3
То есть, вот функция, которая точно выводит, сколько ученик учит слов в день, без рекуррентности:
w(d) = 2d + 3
Проверяем по Wolfram Alpha:
На этом задача не заканчивается. Теперь нам нужно найти тотальную сумму слов, которые ученик выучит на определённый день. Назовём эту функцию T, её параметр (номер дня) назовём n:
T(n) = ∑[d=1..n] w(d)
Это уже не математическая нотация, но что есть в этом текстовом редакторе, то есть.
Разложим краткую запись в ряд и долго-долго будем мотылять члены туда-сюда:
T(n) = w(1) + w(2) + ... + w(n-1) + w(n) = 
     = w(1) + w(1) + 2 + ... + w(1) + 2(n-1) + w(1) + 2n =
     = w(1)∙n + 2∙1 + 2∙2 + ... + 2(n-1) + 2n
Замечаем, что хвост с двойками это арифметическая прогрессия, формула вычисления суммы которой давно известна:
T(n) = w(1)∙n + 2∙(1 + n - 1)(n - 1)/2 =
     = w(1)∙n + n∙n - n =
     = 5n + n∙n - n
     = n^2 + 4n
Вот она формула вычисления количества слов, которые ученик выучит на день n. Проверяем в Wolfram Alpha:
Однако, это ещё не решение. По условию нам нужно на самом деле решить обратную задачу: зная тотальное количество выученных слов, получить количество дней, нужных для этого. И вот здесь начинается самое интересное.
Задача, если выкинуть незначительные детали, сводится к решению вот этого неравенства:
T(d) <= n
Где d это искомый день, а n это заданное количество выученных слов. Раскроем неравенство и немного перераспределим члены:
T(d) <= n
d^2 + 4d <= n
d^2 + 4d - n <= 0
Вообще у этого квадратного неравенства много решений, но мы решаем не общую задачу, а конкретную. У нас есть ограничения. Поэтому применим немного анализа.
  1. Мы знаем, что n > 0, потому что ученик точно выучил хоть сколько-то слов.
  2. Мы знаем, что d > 0, потому что иначе решение не имеет смысла (не может пройти отрицательное количество дней)
  3. Вообще-то, нам нужно решение, которое максимально близко приближает это неравенство к равенству.
  4. Нас интересует целое d, а не вещественное.
Зная всё это, начнём писать формулу для вычисления корней квадратного уравнения. Переименуем d в x чтобы не сойти с ума, и так как коэффициент при члене первой степени чётный, воспользуемся упрощением:
x^2 + 4x - n = 0
x1,x2 = (-b ± √(b^2 - 4ac))/2a = (-2k ± √(4k^2 - 4ac))/2a =
      = (-k ± √(k^2 - ac))/a = [k = 2, a = 1, c = n] =
      = -2 ± √(4 + n)
Для любого положительного n значение -√(4 + n) получается меньше, чем -2, что значит, что -2 -√(4 + n) всегда отрицательное, и значит, этот корень нас не интересует. В итоге, переименовываем x обратно в d и получаем финальную формулу:
d = -2 + √(4 + n)
Проверяем в Wolfram Alpha:
Не забываем, что нас интересует ближайшее целое значение, которое полностью покрывает вычисленное точное значение, то есть, нам нужна функция ceil, и вот наша функция и готова:
function englishWords(n) {
  return Math.ceil(-2 + Math.sqrt(4 + n));
}
Проверяем себя, протабулировав функцию по значениям, которые можем проверить "по бумажке":
То есть:
  1. На 5 слов нужно 1 день (верно)
  2. На 9 слов нужно 2 дня (5 + 7 = 12 > 9) (верно)
  3. На 12 слов нужно 2 дня ровно (верно)
  4. На 15 слов нужно 3 дня (5 + 7 + 9 = 21 > 15) (верно)
  5. На 21 слово нужно 3 дня ровно (верно)
  6. и так далее.
Текст задачи дословно:
Ученик к моменту начала обучения не знает ни одного слова. В первый день занятий он выучил 5 английских слов. В каждый последующий день он выучил на 2 слова больше, чем в предыдущий. Через сколько дней он будет знать не менее n английских слов?
Напишите функцию englishWords, которая принимает в качестве аргумента неотрицательное число n (n>=0)(количество английских слов, которые хочет выучить ученик) и возвращает количество дней, которые необходимы для изучения n слов.
Какое-то переусложнённое объяснение получилось. Достаточно было формулы суммы членов арифметической прогрессии: S=... Читать дальше
Да, я зарабатываю на ✺Толоке 👇  · 14 дек 2021  · toloka.yandex.ru/promo
Вот код функции, которая вам необходима. Задавайте вопросы, если не разобрались с чем-то. const englishWords = (needToKnowCnt) => { let days = 1; let learned = 5; const dalyProgress = 2; const engWorldsTotal =... Читать далее
Заработать пару сотен рублей онлайн на Яндекс✺Толока! Регистрируйся.Перейти на toloka.yandex.ru/promo
Ваша программа решает другую задачу. В задаче написано "каждый день ученик изучает на два слова больше, чем в... Читать дальше
Обычный школьник который помогает по дз! И дикий...  · 4 дек 2021
Подправлю если найду ошибку, но пока может так? Сейчас проверю. Program tt; var z,x,N:integer; BeginN:=1; x:=5; while N<9 do begin z:=x+2; x:=x+z; N:=N+1; end; Writeln (z); Читать далее
Обычный школьник который помогает по дз! И дикий...  · 4 дек 2021
Подправлю если найду ошибку, но пока может так? Сейчас проверю. Program tt; var z,x,N:integer; BeginN:=1; x:=5; while N<9 do begin z:=x+2; x:=x+z; N:=N+1; end; Writeln (z); end. Читать далее
1 эксперт не согласен
Вопрос про JavaScript, а не про Паскаль.