Demigodd
@Demigodd

Как оптимально и красиво решить данную задачу?

Написать рекурсивную функцию которая решает данную задачу.
S(n) = 1/1! + 1/2! + ... + 1/n!

Вот мое решение.

function factorial(n) {
  if (n <= 1) {
    return 1;
  } else {
    return (n * factorial(n - 1));
  }
}

let n = 3;
let sum = 0;

for (let i = n; i >= 1; i--) {
	sum = sum + (1 / factorial(i));
}

/* 1/1! + 1/2! + 1/3! = 1.6 */
console.log(sum);

  • Вопрос задан
  • 140 просмотров
Решения вопроса 1
@Azperin
Дилетант
Ну дак сделай обе функции рекурсией
function factorial(n) {
	if (n > 1) {
		return n * factorial(n - 1);
	} else {
		return 1;
	};
};

function S(n) {
	if (n < 1) {
		return 0;
	} else {
		return (1 / factorial(n)) + S(n - 1);
	};
}

Если прям совсем байты экономиш, то можно и так переписать
function factorial(n) {
	return n > 1 ? (n * factorial(n - 1)) : 1;
}

function S(n) {
	return n > 0 ? ((1 / factorial(n)) + S(n - 1)) : 0;
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@d-sem
Оптимально - использовать готовые инструменты вычисления факториала.

Менее оптимально - использовать математическую формулу.

Если прям хочется программировать, то стоит задуматься о мемоизации (сохранении промежуточных значений, чтобы каждый раз не пересчитывать рекурсивно).
Ответ написан
WblCHA
@WblCHA
Можно каждый раз не считать с нуля факториал.
const sumFactorials = (maxN) => {
  let factorial = 1;
  const getNextFactorial = (n) => {
    factorial *= n;
    return factorial;
  }

  const adder = (sum, n) => 
  	n < maxN ? 
  	1 / getNextFactorial(n) + adder(sum, n + 1) : 
  	sum + 1 / getNextFactorial(n);

  return adder(0, 1);
}

return sumFactorials(3);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Artezio Нижний Новгород
от 130 000 до 180 000 ₽
Artezio Москва
от 160 000 до 220 000 ₽
Intspirit Краснодар
от 80 000 до 150 000 ₽