Первым шагом было бы написать функцию таким образом, чтобы прояснить рекурсивные отношения (вы не можете написать код для непонятного), поэтому не начинайте с этого:
sin(x)= x - x^3/3! + x^5/5! -x^7/7!+ ...
Но вместо этого спросите «как я могу сделать так, чтобы все эти термины с x
выглядели одинаково»:
sin(x)= x^1/1! - x^3/3! + x^5/5! + ...
Хорошее начало, но если мы вернемся, то, что мы действительно ищемэто то, что only вычисляет один из этих терминов, а затем вызывает себя с обновленными аргументами для вычисления следующего термина.В идеале мы хотим что-то вроде:
doThing(args) {
return simpleComputation() + doThings(updatedargs);
}
А потом рекурсия сделает все остальное.Итак, давайте сначала удостоверимся, что нам нужно иметь дело только с +
вместо сочетания +
и -
:
sin(x)= (-1)^0 * x^1/1! + (-1)^1 * x^3/3! + (-1)^2 * x^5/5! + ...
И теперь у вас есть что-то, что вы можете фактически выразить как рекурсивныйотношение, потому что:
sin(x,n) {
return (-1)^n * x^(2n+1) / (2n+1)! + sin(x, n+1);
}
С помощью функции «ярлык»:
sin(x) {
return sin(x,0);
}
И на этом подсказки останавливаются, все остальное вы сможете реализовать самостоятельно.Пока вы помните, остановите рекурсию, потому что серия Тейлора бесконечна, а компьютерные программы и ресурсы - нет.