Teilsumme der harmonischen Sequenz!

13

Definition

In der Mathematik bezieht sich harmonische Folge auf eine Folge, in der

Harmonische Sequenzgleichung

dh der n- te Term der Folge ist gleich dem Kehrwert von n .


Einführung

Bei dieser Abfrage wird bei einer positiven Ganzzahl n als Eingabe die Teilsumme der ersten n Terme der harmonischen Sequenz ausgegeben .


Eingang

Sie erhalten eine positive Ganzzahl (innerhalb des von Ihrer Sprache unterstützten Zahlenbereichs). Es kann entweder signiert oder nicht signiert sein (hängt von Ihnen ab), da die Herausforderung nur positive ganze Zahlen erfordert.

Sie können die Eingabe auf beliebige Weise übernehmen, außer wenn sie in einer vordefinierten Variablen vorhanden ist. Das Lesen von Dateien, Terminals, Modalfenstern ( prompt()in JavaScript) usw. ist erlaubt. Die Eingabe als Funktionsargument ist ebenfalls zulässig.


Ausgabe

Ihr Programm sollte die Summe der ersten n Terme der harmonischen Sequenz als Gleitkommazahl (oder Ganzzahl, wenn die Ausgabe gleichmäßig durch 1 teilbar ist) mit einer Genauigkeit von 5 signifikanten Ziffern ausgeben, wobei n sich auf die Eingabe bezieht. Um dasselbe im mathematischen Jargon zu vermitteln, müssen Sie rechnen

Harmonische Sequenz Partielle Summe der ersten n Terme

Dabei bezieht sich n auf die Eingabe.

Sie können auf jede Art und Weise ausgeben, außer die Ausgabe in eine Variable zu schreiben. Das Schreiben auf Bildschirm, Terminal, Datei, modales Fenster ( alert()in JavaScript) usw. ist erlaubt. Die Ausgabe als Funktionswert returnist ebenfalls erlaubt.


Zusätzliche Regeln


Testfälle

Bei den Testfällen wird davon ausgegangen, dass die Eingabe 1-indiziert ist

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

Gewinnkriterium

Das ist , also gewinnt der kürzeste Code in Bytes!

Arjun
quelle
Könnten Sie uns ein paar Testfälle geben?
Kritixi Lithos
2
Welche Präzision ist erforderlich? Die genaue Ausgabe ist in der Regel nur als Bruch möglich, in vielen Sprachen müssen jedoch getrennte Zahlen für Zähler und Nenner angegeben werden. Können wir a) ein Float, b) einen Bruch oder ein ganzzahliges Paar c) ausgeben?
Level River St
2
@Arjun Die harmonische Reihe wächst bis ins Unendliche, sodass es schwierig wird, 10 Dezimalstellen zu erreichen, wenn die Zahl in die Tausende und Abermillionen geht. Ich würde mich eher für signifikante Zahlen als für Dezimalstellen entscheiden, und ich sehe keinen Grund, so präzise zu sein. 5 signifikante Zahlen sollten ausreichen. also 9.9999E10eher als99999999999.9999999999
Level River St
Können wir über 5 signifikante Zahlen gehen?
Erik der Outgolfer
Übrigens ist bekannt, dass die harmonische Folge keine anderen Ganzzahlen als den Anfangsbuchstaben a_1 = 1 enthält n; dann teilt 2 ^ k den Nenner von a_n.)
Greg Martin

Antworten:

9

Python 3, 27 Bytes

h=lambda n:n and 1/n+h(n-1)
shooqie
quelle
0-Indizierung oder 1-Indizierung?
Arjun
2
Wird ausgelöst, RuntimeErrorwenn Eingaben verarbeitet werden, die größer als das Rekursionslimit sind (standardmäßig 1000).
Sagiksp
Sie können tun, sys.setrecursionlimit(473755252663)aber der Stapel wird schließlich ziemlich leicht überlaufen
Katze
@ Arjun es ist 1-indiziert
Shooqie
8

JavaScript, 19 18 Bytes

Dank @RickHitchcock 1 Byte gespart

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

Dies ist 1-indiziert.

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

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

Kritixi Lithos
quelle
Von dem, was ich von anderen Posts gesehen habe, können Sie f=aus Ihrer Antwort entfernen , um 2 Bytes zu sparen.
Rick Hitchcock
1
@ RickHitchcock Ich kann nicht entfernen, f=weil die Funktion rekursiv ist und sich selbst referenziert f(--a). Aber wenn dies keine rekursive Lösung gewesen wäre, hätte ich das tun können
Kritixi Lithos
Ah, macht Sinn! Speichern Sie ein Byte mit f=a=>a&&1/a+f(--a).
Rick Hitchcock
@ RickHitchcock Schöne!
Kritixi Lithos
6

APL (Dyalog) , 5 Bytes

+/÷∘⍳

Probieren Sie es online!

Sie können ⎕PP←{number}dem Header hinzufügen , um die Genauigkeit auf zu ändern {number}.

Dies ist 1-indiziert.

Erläuterung

+/÷∘⍳                     Right argument; n
                         Range; 1 2 ... n
  ÷                       Reciprocal; 1/1 1/2 ... 1/n
+/                        Sum; 1/1 + 1/2 + ... + 1/n
Kritixi Lithos
quelle
6

Mathematica, 21 20 16 Bytes

Diese Lösung ist 1-indiziert.

Sum[1./i,{i,#}]&
J42161217
quelle
Es ist 1-Indizierung
J42161217
1
> Sie dürfen kein eingebautes Element verwenden, um die Teilsumme der ersten n Elemente zu berechnen. (Ja, es ist für Sie Mathematica!)
MCCCS
4
OP bedeutet, dass ich HarmonicNumber [#] &
J42161217
4
Und man kann weiter verkürzen Tr[1./Range@#]&.
Greg Martin
2
@Ian Mathematica kann angezeigt werden 5 sig fig, aber die Funktion kehrt Maschinengenauigkeit Nummern (52 Binärbits oder knapp 16 Dezimalziffern precision)
LLlAMnYP
5

PHP, 33 Bytes

1-Indizierung

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

Probieren Sie es online!

Jörg Hülsermann
quelle
5

Japt -x , 8 6 5 3 Bytes

õpJ

Mit einigem Dank an ETHproductions

Probieren Sie es online aus

Zottelig
quelle
0-Indizierung oder 1-Indizierung?
Arjun
Ich denke, Sie können ein Byte speichern mitõ x@1/X
ETHproductions
... und noch ein paar Bytes mit XpJanstelle von 1/X:-)
ETHproductions
Danke, @ETHproductions :) Ich habe sie gezwickt, sobald ich weggegangen bin.
Shaggy
Eigentlich glaube ich nicht, dass man das _aufgrund von Auto-Funktionen überhaupt braucht . Ich sollte diesen Tipp wirklich schreiben: P (ich sollte heute oder morgen Zeit haben, weil es Memorial Day ist)
ETHproductions
4

CJam , 11 10 Bytes

Dank Erik, dem Outgolfer, wurde 1 Byte entfernt

ri),{W#+}*

Dies verwendet eine 1-basierte Indizierung.

Probieren Sie es online!

Erläuterung

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
quelle
Sie können Wanstelle von verwenden -1.
Erik der Outgolfer
@EriktheOutgolfer hat sich selbst überfordert :-)
Luis Mendo
@ LuisMendo Ich mag meinen Namen, es ist nur ein Name. Und ja, ich habe mich selbst übertrieben, als ich einem anderen Golfer noch weiter geholfen habe.
Erik der Outgolfer
@Erik Es war als Witz gedacht. Vielen Dank für die Hilfe
Luis Mendo
3

Haskell, 20 Bytes

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

Originallösung, 22 Bytes

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

Diese Lösungen gehen von einer 1-indizierten Eingabe aus.

Ryan McCleary
quelle
3

Tcl 38 Bytes

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

Das ist ein sehr schmutziger Hack, und die rekursiven Aufrufe übergeben Literal-Strings wie "5-1-1-1 ...", bis der Wert 0 lautet.

avl42
quelle
Danke @Christopher für die Formatierung. Damit war die Verdopplung von Backslash nicht mehr notwendig.
Avl42
Kein Problem! Es sieht besser aus
Christopher
2

MATL, 5 Bytes

:l_^s

Diese Lösung verwendet eine 1-basierte Indizierung.

Probieren Sie es bei MATL Online aus

Erläuterung

    % 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
quelle
2

Axiom, 45 34 Bytes

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

1-indiziert; Es hat Argument eine positive Ganzzahl (PI) und gibt "Any" zurück, das das Sys in den für die nächste Funktion nützlichen Typ konvertiert (oder nicht konvertiert).

(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
quelle
1

C 54 Bytes

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

Verwendet 1-indizierte Zahlen.

Uriel
quelle
1

QBIC , 13 Bytes

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

Erläuterung

[ |        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
quelle
0

Haskell, 21 Bytes

f n=sum$map(1/)[1..n]
Uri Goren
quelle
0

Braingolf, 20 Bytes [nicht konkurrierend]

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

Dies funktioniert nicht wirklich, da Braingolf nicht mit Schwimmern arbeiten kann, aber die Logik ist korrekt.

Erläuterung:

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

Hier ist ein modifizierter Interpreter , der Floats unterstützt. Das erste Argument wird eingegeben.

Skidsdev
quelle
0

Gol> <> , 8 Bytes

F1LP,+|B

Probieren Sie es online!

Beispiel volles Programm & wie es funktioniert

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
quelle