Somme partielle de séquence harmonique!

13

Définition

En mathématiques, la séquence harmonique fait référence à une séquence où

Harmonic Sequence Equation

c'est-à-dire que le n ème terme de la séquence est égal à l'inverse de n .


introduction

Dans ce défi, étant donné un entier positif n en entrée, sortez la somme partielle des n premiers termes de la séquence harmonique.


Contribution

Vous recevrez un entier positif (dans la plage de nombres pris en charge par votre langue). Il peut s'agir de Signé et de Non signé (dépend de vous), car le défi ne nécessite que des entiers positifs.

Vous pouvez prendre l'entrée de n'importe quelle manière, sauf en supposant qu'elle soit présente dans une variable prédéfinie. La lecture à partir d'un fichier, d'un terminal, d'une fenêtre modale ( prompt()en JavaScript), etc. est autorisée. Prendre l'entrée comme argument de fonction est également autorisé.


Production

Votre programme doit sortir la somme des n premiers termes de la séquence harmonique sous forme de flottant (ou entier si la sortie est divisible par 1) avec une précision de 5 chiffres significatifs, où n se réfère à l'entrée. Pour transmettre la même chose dans le jargon mathématique, vous devez calculer

Harmonic Sequence Partial Sum of first n terms

n fait référence à l'entrée.

Vous pouvez sortir de n'importe quelle manière, sauf écrire la sortie dans une variable. L'écriture sur écran, terminal, fichier, fenêtre modale ( alert()en JavaScript), etc. est autorisée. La sortie en tant que returnvaleur de fonction est également autorisée.


Règles supplémentaires


Cas de test

Les cas de test supposent que l'entrée est indexée 1

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

Critère gagnant

Il s'agit de , donc le code le plus court en octets gagne!

Arjun
la source
Pourriez-vous nous donner quelques tests?
user41805
2
Quelle précision est requise? La sortie exacte n'est généralement possible qu'en tant que fraction, mais dans de nombreuses langues, il faudra des nombres séparés pour le numérateur et le dénominateur. Peut-on produire a) un flottant, b) une fraction ou une paire entière c)?
Level River St,
2
@Arjun La série harmonique croît à l'infini, il sera donc difficile de respecter 10 décimales lorsque le nombre atteindra les milliers et les millions. Je choisirais des chiffres significatifs plutôt que des décimales, et je ne vois pas la nécessité d'être aussi précis. 5 chiffres significatifs devraient suffire. donc 9.9999E10plutôt que99999999999.9999999999
Level River St
Pouvons-nous dépasser 5 chiffres significatifs?
Erik the Outgolfer
Soit dit en passant, on sait que la séquence harmonique ne contient pas d'entiers autres que l'initiale a_1 = 1. (Idée de preuve que a_n n'est pas un entier pour n> 1: soit 2 ^ k la plus grande puissance de 2 ne dépassant pas n; puis 2 ^ k divise le dénominateur de a_n.)
Greg Martin

Réponses:

9

Python 3, 27 octets

h=lambda n:n and 1/n+h(n-1)
shooqie
la source
0 indexation ou 1 indexation?
Arjun
2
Lève RuntimeErrorlors de la gestion d'une entrée supérieure à la limite de récursivité, 1000 par défaut.
sagiksp
vous pouvez le faire sys.setrecursionlimit(473755252663)mais la pile finira par déborder assez facilement
cat
@Arjun c'est 1 indexé
shooqie
8

JavaScript, 19 18 octets

1 octet enregistré grâce à @RickHitchcock

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

Ceci est indexé 1.

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

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

user41805
la source
D'après ce que j'ai vu d'autres articles, vous pouvez supprimer f=de votre réponse pour économiser 2 octets.
Rick Hitchcock
1
@RickHitchcock Je ne peux pas supprimer f=car la fonction est récursive et se référence dans f(--a). Mais si ce n'était pas une solution récursive, j'aurais pu le faire
user41805
Ah, c'est logique! Économisez un octet avec f=a=>a&&1/a+f(--a).
Rick Hitchcock
@RickHitchcock Nice one!
user41805
6

APL (Dyalog) , 5 octets

+/÷∘⍳

Essayez-le en ligne!

Vous pouvez ajouter ⎕PP←{number}à l'en-tête pour changer la précision en {number}.

Ceci est indexé 1.

Explication

+/÷∘⍳                     Right argument; n
                         Range; 1 2 ... n
  ÷                       Reciprocal; 1/1 1/2 ... 1/n
+/                        Sum; 1/1 + 1/2 + ... + 1/n
user41805
la source
6

Mathematica, 21 20 16 octets

Cette solution est indexée 1.

Sum[1./i,{i,#}]&
J42161217
la source
C'est 1-indexation
J42161217
1
> Vous ne devez pas utiliser de fonction intégrée pour calculer la somme partielle des n premiers éléments. (Ouais, c'est pour toi Mathematica!)
MCCCS
4
OP signifie que je ne peux pas utiliser HarmonicNumber [#] &
J42161217
4
Et on peut encore raccourcir à Tr[1./Range@#]&.
Greg Martin
2
@Ian Mathematica peut afficher 5 sig fig, mais la fonction renvoie des nombres de précision machine (52 bits binaires ou un peu moins de 16 chiffres décimaux de précision)
LLlAMnYP
5

PHP, 33 octets

1-indexation

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

Essayez-le en ligne!

Jörg Hülsermann
la source
5

Japt -x , 8 6 5 3 octets

õpJ

Merci à ETHproductions

Essayez-le en ligne

Hirsute
la source
0 indexation ou 1 indexation?
Arjun
Je pense que vous pouvez enregistrer un octet avecõ x@1/X
ETHproductions
... et un autre couple d'octets en utilisant XpJau lieu de 1/X:-)
ETHproductions
Merci, @ETHproductions :) Je les ai branchées dès que je suis parti.
Shaggy
En fait, je ne pense pas que vous ayez même besoin du à _cause des fonctions automatiques. Je devrais vraiment écrire cette astuce: P (je devrais avoir du temps aujourd'hui ou demain, car c'est le Memorial Day)
ETHproductions
4

CJam, 11 10 bytes

1 byte removed thanks to Erik the outgolfer

ri),{W#+}*

This uses 1-based indexing.

Try it online!

Explanation

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
la source
You can use W instead of -1.
Erik the Outgolfer
@EriktheOutgolfer has outgolfed himself :-)
Luis Mendo
@LuisMendo I like my name, it's just a name. And yes I outgolfed myself in the process of helping a fellow golfer golf even further.
Erik the Outgolfer
@Erik It was meant as a joke. Thanks for the help
Luis Mendo
3

Haskell, 20 bytes

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

Original solution, 22 bytes

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

These solutios assumes 1-indexed input.

Ryan McCleary
la source
3

Tcl 38 bytes

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

That's a very dirty hack, and the recursive calls pass literal strings like "5-1-1-1..." until it evaluates to 0.

avl42
la source
Thanks @Christopher for the formatting. With that, the duplication of backslash was no longer necessary.
avl42
No problem! It looks better
Christopher
2

MATL, 5 bytes

:l_^s

This solution uses 1-based indexing.

Try it at MATL Online

Explanation

    % 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
la source
2

Axiom, 45 34 bytes

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

1-Indexed; It has argument one positive integer(PI) and return "Any" that the sys convert (or not convert) to the type useful for next function arg (at last it seems so seeing below examples)

(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
la source
1

C, 54 bytes

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

Uses 1-indexed numbers.

Uriel
la source
1

QBIC, 13 bytes

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

Explanation

[ |        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
la source
1

Gol><>, 8 bytes

F1LP,+|B

Try it online!

Example full program & How it works

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
la source
0

Haskell, 21 bytes

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

Braingolf, 20 bytes [non-competing]

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

This won't actually work due to braingolf's inability to work with floats, however the logic is correct.

Explanation:

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

Here's a modified interpreter that supports floats. First argument is input.

Skidsdev
la source