Częściowa suma sekwencji harmonicznych!

13

Definicja

W matematyce sekwencja harmoniczna odnosi się do sekwencji, w której

Równanie sekwencji harmonicznej

tj. n- ty ciąg sekwencji jest równy odwrotności n .


Wprowadzenie

W tym wyzwaniu, biorąc pod uwagę dodatnią liczbę całkowitą n jako dane wejściowe, wyprowadza Częściową Sumę pierwszych n wyrazów Sekwencji Harmonicznej.


Wejście

Otrzymasz dodatnią liczbę całkowitą (w zakresie liczb obsługiwanych przez Twój język). Może to być zarówno podpisany, jak i niepodpisany (zależy od ciebie), ponieważ wyzwanie wymaga tylko dodatnich liczb całkowitych.

Możesz wziąć dane wejściowe w jakikolwiek sposób, z wyjątkiem zakładania, że ​​będą obecne w predefiniowanej zmiennej. Odczytywanie z pliku, terminala, okna modalnego ( prompt()w JavaScript) itp. Jest dozwolone. Przyjmowanie argumentu wejściowego jako funkcji jest również dozwolone.


Wynik

Twój program powinien wypisać sumę pierwszych n wyrazów sekwencji harmonicznej jako liczbę zmiennoprzecinkową (lub liczbę całkowitą, jeśli wynik jest równomiernie podzielny przez 1) z dokładnością do 5 cyfr znaczących, gdzie n odnosi się do danych wejściowych. Aby przekazać to samo w żargonie matematycznym, musisz obliczyć

Sekwencja harmoniczna Częściowa suma pierwszych n wyrazów

gdzie n odnosi się do danych wejściowych.

Możesz wyprowadzać dane w dowolny sposób, z wyjątkiem zapisywania wyników w zmiennej. alert()Dozwolone jest zapisywanie na ekranie, terminalu, pliku, oknie modalnym ( w JavaScript) itp. Wyjście jako returnwartość funkcji jest również dozwolone.


Dodatkowe zasady


Przypadki testowe

Przypadki testowe zakładają, że dane wejściowe mają indeks 1

Input     Output
1         1
2         1.5
3         1.8333
4         2.0833
5         2.2833

Zwycięskie kryterium

To jest , więc wygrywa najkrótszy kod w bajtach!

Arjun
źródło
Czy możesz dać nam jakieś testcases?
user41805
2
Jaka precyzja jest wymagana? Dokładne wyjście jest generalnie możliwe tylko jako ułamek, ale w wielu językach będą musiały być osobnymi liczbami dla licznika i mianownika. Czy możemy wyprowadzić a) liczbę zmiennoprzecinkową, b) parę ułamkową lub całkowitą c) albo?
Level River St
2
@Arjun Szereg harmonicznych rośnie do nieskończoności, więc trudno będzie znaleźć 10 miejsc po przecinku, gdy liczba ta będzie się zwiększać w tysiącach i milionach. Wybrałbym znaczące liczby zamiast miejsc po przecinku i nie widzę potrzeby, aby być tak precyzyjnym. Powinno wystarczyć 5 znaczących liczb. więc 9.9999E10raczej niż99999999999.9999999999
Level River St
Czy możemy przekroczyć 5 znaczących liczb?
Erik the Outgolfer
Nawiasem mówiąc, wiadomo, że sekwencja harmoniczna nie zawiera żadnych liczb całkowitych innych niż początkowa a_1 = 1. (Pomysł dowodu, że a_n nie jest liczbą całkowitą dla n> 1: niech 2 ^ k będzie największą potęgą 2 nieprzekraczającą n; następnie 2 ^ k dzieli mianownik a_n.)
Greg Martin

Odpowiedzi:

9

Python 3, 27 bajtów

h=lambda n:n and 1/n+h(n-1)
shooqie
źródło
Indeksowanie 0 czy indeksowanie 1?
Arjun
2
Zgłasza, RuntimeErrorgdy obsługuje dane wejściowe większe niż limit rekurencji, domyślnie 1000.
sagiksp
możesz to zrobić, sys.setrecursionlimit(473755252663)ale stos ostatecznie przepełni się dość łatwo
kot
@Arjun jest indeksowany 1
shooqie
8

JavaScript, 19 18 bajtów

1 bajt zapisany dzięki @RickHitchcock

f=a=>a&&1/a+f(--a)

Jest to indeks 1.

f=a=>a&&1/a+f(--a)

for(i=0;++i<10;)console.log(f(i))

user41805
źródło
Z tego, co widziałem w innych postach, możesz usunąć f=z odpowiedzi, aby zapisać 2 bajty.
Rick Hitchcock
1
@ RickHitchcock Nie mogę usunąć, f=ponieważ funkcja jest rekurencyjna i odwołuje się do niej f(--a). Ale gdyby nie było to rozwiązanie rekurencyjne, byłbym w stanie to zrobić
user41805
Ach, to ma sens! Zaoszczędź jeden bajt za pomocą f=a=>a&&1/a+f(--a).
Rick Hitchcock
@RickHitchcock Nice one!
user41805
6

APL (Dyalog) , 5 bajtów

+/÷∘⍳

Wypróbuj online!

Możesz dodać ⎕PP←{number}do nagłówka, aby zmienić precyzję na {number}.

Jest to indeks 1.

Wyjaśnienie

+/÷∘⍳                     Right argument; n
                         Range; 1 2 ... n
  ÷                       Reciprocal; 1/1 1/2 ... 1/n
+/                        Sum; 1/1 + 1/2 + ... + 1/n
user41805
źródło
6

Mathematica, 21 20 16 bajtów

To rozwiązanie ma indeks 1.

Sum[1./i,{i,#}]&
J42161217
źródło
Jest to indeksowanie 1
J42161217
1
> Nie wolno używać wbudowanego do obliczania częściowej sumy pierwszych n elementów. (Tak, to dla ciebie Mathematica!)
MCCCS
4
OP oznacza, że ​​nie mogę używać HarmonicNumber [#] &
J42161217
4
I można dalej skrócić Tr[1./Range@#]&.
Greg Martin
2
@Ian Mathematica może wyświetlać 5 cyfr sig, ale funkcja zwraca liczby precyzji maszynowej (52 bity binarne lub nieco mniej niż 16 cyfr dziesiętnych precyzji)
LLlAMnYP
5

PHP, 33 bajtów

1-indeksowanie

for(;$i++<$argn;)$s+=1/$i;echo$s;

Wypróbuj online!

Jörg Hülsermann
źródło
5

Japt -x , 8 6 5 3 bajtów

õpJ

Z podziękowaniami dla ETHproductions

Wypróbuj online

Kudłaty
źródło
Indeksowanie 0 czy indeksowanie 1?
Arjun
Myślę, że możesz uratować bajt za pomocąõ x@1/X
ETHproductions
... i jeszcze kilka bajtów przy użyciu XpJzamiast 1/X:-)
ETHprodukcje
Dzięki, @ETHproductions :) Przekręciłem je, gdy tylko odszedłem.
Kudłaty
Właściwie nie sądzę, że potrzebujesz nawet ze _względu na automatyczne funkcje. Powinienem naprawdę napisać tę wskazówkę: P (powinienem mieć czas dzisiaj lub jutro, ponieważ jest to Dzień Pamięci)
ETHprodukcje
4

CJam , 11 10 bajtów

1 bajt usunięty dzięki Erikowi outgolferowi

ri),{W#+}*

Wykorzystuje to indeksowanie 1.

Wypróbuj online!

Wyjaśnienie

ri            e# Read integer, n
  )           e# Increment by 1: gives n+1
   ,          e# Range: gives [0 1 2 ... n]
    {   }*    e# Fold this block over the array
     W#       e# Inverse of a number
       +      e# Add two numbers
Luis Mendo
źródło
Możesz użyć Wzamiast -1.
Erik the Outgolfer
@EriktheOutgolfer sam się rozegrał :-)
Luis Mendo
@LuisMendo Lubię moje imię, to tylko imię. I tak, obezwładniłem się, pomagając jeszcze bardziej golfistom.
Erik the Outgolfer
@Erik To miał być żart. Dzięki za pomoc
Luis Mendo
3

Haskell, 20 bajtów

f 0=0
f n=1/n+f(n-1)

Oryginalne rozwiązanie, 22 bajty

f n=sum[1/k|k<-[1..n]]

Te rozwiązania zakładają wejście 1-indeksowane.

Ryan McCleary
źródło
3

Tcl 38 bajtów

proc h x {expr $x?1./($x)+\[h $x-1]:0}

To bardzo brudny hack, a rekurencyjne wywołania przekazują dosłowne ciągi, takie jak „5-1-1-1 ...”, dopóki nie zostaną ocenione na 0.

avl42
źródło
Dzięki @Christopher za formatowanie. Dzięki temu powielanie odwrotnego ukośnika nie było już konieczne.
avl42
Nie ma problemu! Wygląda lepiej
Christopher
2

MATL, 5 bajtów

:l_^s

To rozwiązanie wykorzystuje indeksowanie 1.

Wypróbuj w MATL Online

Wyjaśnienie

    % Implicitly grab input (N)
:   % Create an array from [1...N]
l_^ % Raise all elements to the -1 power (take the inverse of each)
s   % Sum all values in the array and implicitly display the result
Suever
źródło
2

Aksjomat, 45 34 bajtów

f(x:PI):Any==sum(1./n,n=1..x)::Any

1-indeksowane; Ma argument jedną dodatnią liczbę całkowitą (PI) i zwraca „Dowolny”, który sys konwertuje (lub nie konwertuje) na typ przydatny dla następnej funkcji arg (w końcu wygląda to tak, widząc poniższe przykłady)

(25) -> [[i,f(i)] for i in 1..9]
   (25)
   [[1,1.0], [2,1.5], [3,1.8333333333 333333333], [4,2.0833333333 333333333],
    [5,2.2833333333 333333333], [6,2.45], [7,2.5928571428 571428572],
    [8,2.7178571428 571428572], [9,2.8289682539 682539683]]
                                                      Type: List List Any
(26) -> f(3000)
   (26)  8.5837498899 591871142
                                        Type: Union(Expression Float,...)
(27) -> f(300000)
   (27)  13.1887550852 056117
                                        Type: Union(Expression Float,...)
(29) -> f(45)^2
   (29)  19.3155689383 88117644
                                                   Type: Expression Float
RosLuP
źródło
1

C, 54 bajty

i;float f(n){float s;for(i=n+1;--i;s+=1./i);return s;}

Używa liczb zindeksowanych 1.

Uriel
źródło
1

QBIC , 13 bajtów

[:|c=c+1/a]?c

Wyjaśnienie

[ |        FOR a = 1 to
 :            the input n
   c=c+    Add to c (starts off as 0)
   1/a     the reciprocal of the loop iterator
]          NEXT
?c         PRINT c
Steenbergh
źródło
1

Gol> <> , 8 bajtów

F1LP,+|B

Wypróbuj online!

Przykład pełnego programu i jak to działa

1AGIE;GN
F1LP,+|B

1AGIE;GN
1AG       Register row 1 as function G
   IE;    Take input as int, halt if EOF
      GN  Call G and print the result as number
          Repeat indefinitely

F1LP,+|B
F     |   Repeat n times...
 1LP,       Compute 1 / (loop counter + 1)
     +      Add
       B  Return
Bubbler
źródło
0

Haskell, 21 bajtów

f n=sum$map(1/)[1..n]
Uri Goren
źródło
0

Braingolf, 20 bajtów [niekonkurujący]

VR1-1[1,!/M,$_1+]v&+

To tak naprawdę nie zadziała z powodu niemożności braingolfa do pracy z pływakami, jednak logika jest poprawna.

Wyjaśnienie:

VR1-1[1,!/M,$_1+]v&+   Implicit input
VR                     Create new stack and return to main stack
  1-                   Decrement input
    1                  Push 1
     [..........]      Loop, always runs once, then decrements first item on stack at ]
                       Breaks out of loop if first item on stack reaches 0
      1,!/             Push 1, swap last 2 values, and divide without popping
                       Original values are kept on stack, and result of division is pushed
          M,$_         Move result of division to next stack, then swap last 2 items and
                       Silently pop last item (1)
              1+       Increment last item on stack
                 v&+   Move to next stack, sum entire stack 
                       Implicit output of last item on current stack

Oto zmodyfikowany interpreter, który obsługuje zmiennoprzecinkowe. Pierwszy argument jest wprowadzany.

Skidsdev
źródło