Что это начало происходить, когда я понизил
blockquote>jdk-11.0.2
доjdk1.8.0_191
.Это +
java.lang.NoSuchMethodException
на самом деле довольно подозрительно. КлассModuleReferenceImpl
является расширенным классомModuleReference
, , который был доступен с Java 9 .
Ответ @Kiv корректен, но это медленно для большого n, если Вам не нужна бесконечная точность. Лучше использовать асимптотическую формулу в этом случае:
#!/usr/bin/env python
from math import log
def H(n):
"""Returns an approximate value of n-th harmonic number.
http://en.wikipedia.org/wiki/Harmonic_number
"""
# Euler-Mascheroni constant
gamma = 0.57721566490153286060651209008240243104215933593992
return gamma + log(n) + 0.5/n - 1./(12*n**2) + 1./(120*n**4)
Ответ @Kiv для Python 2.6:
from fractions import Fraction
harmonic_number = lambda n: sum(Fraction(1, d) for d in xrange(1, n+1))
Пример:
>>> N = 100
>>> h_exact = harmonic_number(N)
>>> h = H(N)
>>> rel_err = (abs(h - h_exact) / h_exact)
>>> print n, "%r" % h, "%.2g" % rel_err
100 5.1873775176396242 6.8e-16
В N = 100
относительная погрешность меньше затем 1e-15
.
Решение @recursive правильно для приближения с плавающей точкой. Если Вы предпочитаете, можно получить точный ответ в Python 3.0 с помощью модуля частей:
>>> from fractions import Fraction
>>> def calc_harmonic(n):
... return sum(Fraction(1, d) for d in range(1, n + 1))
...
>>> calc_harmonic(20) # sum of the first 20 terms
Fraction(55835135, 15519504)
Обратите внимание, что количество цифр растет быстро, таким образом, это потребует большой памяти для большого n. Вы могли также использовать генератор для рассмотрения серии частичных сумм, если бы Вы хотели стать действительно необычными.
Просто сноска на других ответах, которые использовали плавающую точку; запуск с самого большого делителя и итерация вниз (к обратным величинам с самым большим значением) отложат накопленную ошибку округления как можно больше.
Это должно добиться цели.
def calc_harmonic(n):
return sum(1.0/d for d in range(2,n+1))
Гармонический ряд отличается, т.е. его сумма является бесконечностью..
править: Если Вы не хотите частичные суммы, но Вы действительно не согласились с этим.
Как насчет этого:
partialsum = 0
for i in xrange(1,1000000):
partialsum += 1.0 / i
print partialsum
где 1000000 верхняя граница.
Домашняя работа?
Это - расходящиеся ряды, таким образом, невозможно суммировать его для всех условий.
Я не знаю Python, но я знаю, как записать это в Java.
public class Harmonic
{
private static final int DEFAULT_NUM_TERMS = 10;
public static void main(String[] args)
{
int numTerms = ((args.length > 0) ? Integer.parseInt(args[0]) : DEFAULT_NUM_TERMS);
System.out.println("sum of " + numTerms + " terms=" + sum(numTerms));
}
public static double sum(int numTerms)
{
double sum = 0.0;
if (numTerms > 0)
{
for (int k = 1; k <= numTerms; ++k)
{
sum += 1.0/k;
}
}
return sum;
}
}