Похоже, ваша ошибка в том, что вам не хватило четных чисел.
var evenNumbers = [Int]()
for i in 2...10 {
if i % 2 == 0 {
evenNumbers.append(i)
}
}
После выполнения вышеприведенного запроса evenNumbers
будет заполнено [2,4,6,8,10]
. Но чтобы оценить 10 терминов, вам нужны четные числа до 18 или 20, в зависимости от того, считаете ли вы «1006 *» «термином». Следовательно, вы должны l oop до 18
или 20
:
var evenNumbers = [Int]()
for i in 2...18 { // I think the 1 at the beginning should count as a "term"
if i % 2 == 0 {
evenNumbers.append(i)
}
}
В качестве альтернативы, вы можете создать этот массив следующим образом:
let evenNumbers = (1..<10).map { $0 * 2 }
Это означает "для каждое число от 1 (включительно) до 10 (исключая), умножьте каждое на 2 ".
Теперь ваше решение даст вам ответ -0.1776034
.
Вот мой ( довольно медленное) решение:
func productOfFirstNEvenNumbers(_ n: Int) -> Float {
if n == 0 {
return 1
}
let firstNEvenNumbers = (1...n).map { Float($0) * 2.0 }
// ".reduce(1.0, *)" means "multiply everything"
return firstNEvenNumbers.reduce(1.0, *)
}
func nthTerm(_ n: Int, x: Float) -> Float {
let numerator = pow(x, Float(n) * 2)
// yes, this does recalculate the product of even numbers every time...
let product = productOfFirstNEvenNumbers(n)
let denominator = product * product
return numerator / (denominator) * pow(-1, Float(n))
}
func bessel10Terms(x: Float) -> Float {
// for each number n in the range 0..<10, get the nth term, add them together
(0..<10).map { nthTerm($0, x: x) }.reduce(0, +)
}
print(bessel10Terms(x: 5))