Jumlah Parsial Urutan Harmonik!


13

Definisi

Dalam Matematika, Urutan Harmonik mengacu pada urutan di mana

Persamaan Urutan Harmonik

yaitu istilah ke- n dari urutan sama dengan kebalikan dari n .


pengantar

Dalam tantangan ini, diberi bilangan bulat positif n sebagai input, output Jumlah Parsial dari n pertama istilah Urutan Harmonik.


Memasukkan

Anda akan diberikan bilangan bulat positif (dalam kisaran angka yang didukung oleh bahasa Anda). Itu bisa berupa Ditandatangani dan Tidak Ditandatangani (tergantung Anda), karena tantangannya hanya memerlukan bilangan bulat positif.

Anda dapat mengambil input dengan cara apa pun kecuali menganggapnya ada dalam variabel yang telah ditentukan. Membaca dari file, terminal, jendela modal ( prompt()dalam JavaScript) dll diperbolehkan. Mengambil input sebagai argumen fungsi juga diperbolehkan.


Keluaran

Program Anda harus menampilkan jumlah dari n pertama istilah Urutan Harmonik sebagai pelampung (atau bilangan bulat jika hasilnya dibagi rata dengan 1) dengan presisi 5 angka signifikan, di mana n merujuk pada input. Untuk menyampaikan hal yang sama dalam jargon Matematika, Anda harus menghitung

Harmonic Sequence Jumlah Parsial dari n istilah pertama

di mana n mengacu pada input.

Anda dapat membuat output dengan cara apa pun kecuali menulis output ke variabel. Menulis ke layar, terminal, file, jendela modal ( alert()dalam JavaScript) dll. Diperbolehkan. Keluaran sebagai returnnilai fungsi juga diizinkan.


Aturan tambahan


Uji Kasus

Kasus Uji menganggap input sebagai 1-diindeks

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

Kriteria Kemenangan

Ini adalah , jadi kode terpendek dalam byte menang!


Bisakah Anda memberi kami beberapa testcases?
Lithos Kritixi

2
Presisi apa yang dibutuhkan? Keluaran yang tepat umumnya hanya mungkin sebagai pecahan, tetapi dalam banyak bahasa yang harus menjadi angka yang terpisah untuk pembilang dan penyebut. Bisakah kita mengeluarkan a) float, b) pasangan fraksi atau bilangan bulat c)?
Level River St

2
@Arjun Seri harmonik tumbuh hingga tak terbatas sehingga akan sulit untuk memenuhi 10 tempat desimal karena jumlahnya mencapai ribuan dan jutaan. Saya akan mencari angka yang signifikan daripada tempat desimal, dan saya melihat tidak perlu begitu tepat. 5 angka signifikan harus cukup. jadi 9.9999E10daripada99999999999.9999999999
Level River St

Bisakah kita melihat lebih dari 5 angka penting?
Erik the Outgolfer

Ngomong-ngomong, diketahui bahwa deret harmonik tidak mengandung bilangan bulat selain a_1 awal = 1. (Ide pembuktian bahwa a_n bukan bilangan bulat untuk n> 1: biarkan 2 ^ k menjadi kekuatan terbesar 2 yang tidak melebihi n; lalu 2 ^ k membagi penyebut a_n.)
Greg Martin

Jawaban:



9

Python 3, 27 byte

h=lambda n:n and 1/n+h(n-1)

Pengindeksan 0 atau pengindeksan 1?
Arjun

2
Melempar RuntimeErrorsaat menangani input lebih besar dari batas rekursi, 1000 secara default.
sagiksp

Anda dapat melakukannya sys.setrecursionlimit(473755252663)tetapi tumpukan pada akhirnya akan meluap dengan cukup mudah
cat

@Arjun ini diindeks 1
shooqie

8

JavaScript, 19 18 byte

1 byte disimpan berkat @RickHitchcock

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

Ini 1-diindeks.

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

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


Dari apa yang saya lihat dari posting lain, Anda dapat menghapus f=dari jawaban Anda untuk menghemat 2 byte.
Rick Hitchcock

1
@RickHitchcock Saya tidak bisa menghapus f=karena fungsinya rekursif dan itu referensi sendiri f(--a). Tetapi jika ini bukan solusi rekursif, saya akan bisa melakukan itu
Kritixi Lithos

Ah, masuk akal! Simpan satu byte dengan f=a=>a&&1/a+f(--a).
Rick Hitchcock

@RickHitchcock Bagus sekali!
Kritixi Lithos

6

APL (Dyalog) , 5 byte

+/÷∘⍳

Cobalah online!

Anda dapat menambahkan ⎕PP←{number}ke tajuk untuk mengubah ketepatan{number} .

Ini 1-diindeks.

Penjelasan

+/÷∘⍳                     Right argument; n
                         Range; 1 2 ... n
  ÷                       Reciprocal; 1/1 1/2 ... 1/n
+/                        Sum; 1/1 + 1/2 + ... + 1/n

6

Mathematica, 21 20 16 byte

Solusi ini diindeks 1.

Sum[1./i,{i,#}]&

Ini adalah pengindeksan 1
J42161217

1
> Anda tidak boleh menggunakan built-in untuk menghitung jumlah parsial dari n elemen pertama. (Ya, ini untuk Anda Mathematica!)
MCCCS

4
OP berarti saya tidak bisa menggunakan HarmonicNumber [#] &
J42161217

4
Dan seseorang dapat lebih pendek menjadi Tr[1./Range@#]&.
Greg Martin

2
@Ian Mathematica dapat menampilkan 5 sig ara, tetapi fungsinya mengembalikan angka ketepatan mesin (52 bit biner atau tepat di bawah 16 digit desimal presisi)
LLlAMnYP




5

Japt -x , 8 6 5 3 byte

õpJ

Dengan beberapa terima kasih kepada ETHproductions

Cobalah online


Pengindeksan 0 atau pengindeksan 1?
Arjun

Saya pikir Anda dapat menyimpan byte denganõ x@1/X
ETHproduksi

... dan beberapa byte lainnya dengan menggunakan XpJalih-alih 1/X:-)
ETHproduksi

Terima kasih, @ ETHproductions :) Saya memutar mereka begitu saya pergi.
Shaggy

Sebenarnya saya tidak berpikir Anda bahkan memerlukan _karena fungsi otomatis. Saya harus benar-benar menulis tip itu: P (saya harus punya waktu hari ini atau besok, karena hari itu adalah Hari Peringatan)
ETHproduksi

4

CJam , 11 10 byte

1 byte dihapus berkat Erik the outgolfer

ri),{W#+}*

Ini menggunakan pengindeksan berbasis 1.

Cobalah online!

Penjelasan

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

Anda bisa menggunakan Wbukan -1.
Erik the Outgolfer

@EriktheOutgolfer telah mengalahkan dirinya sendiri :-)
Luis Mendo

@LuisMendo Saya suka nama saya, itu hanya nama. Dan ya saya mengalahkan diri saya sendiri dalam proses membantu sesama pegolf golf lebih jauh.
Erik the Outgolfer

@Erik Itu dimaksudkan sebagai lelucon. Terima kasih atas bantuannya
Luis Mendo

3

Haskell, 20 byte

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

Solusi asli, 22 byte

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

Solutios ini mengasumsikan input 1-diindeks.



3

Tcl 38 byte

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

Itu peretasan yang sangat kotor, dan panggilan rekursif melewati string literal seperti "5-1-1-1 ..." hingga bernilai 0.


Terima kasih @Christopher atas pemformatannya. Dengan itu, duplikasi backslash tidak lagi diperlukan.
avl42

Tidak masalah! Itu terlihat lebih baik
Christopher


2

MATL, 5 byte

:l_^s

Solusi ini menggunakan pengindeksan berbasis 1.

Cobalah di MATL Online

Penjelasan

    % 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

2

Aksioma, 45 34 byte

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

1-Diindeks; Ini memiliki argumen satu bilangan bulat positif (PI) dan mengembalikan "Apa saja" yang dikonversi oleh sistem (atau tidak dikonversi) ke tipe yang berguna untuk fungsi arg berikutnya (akhirnya sepertinya begitu melihat contoh di bawah ini)

(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


1

C, 54 byte

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

Menggunakan angka 1-diindeks.



1

QBIC , 13 byte

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

Penjelasan

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

1

Gol> <> , 8 byte

F1LP,+|B

Cobalah online!

Contoh program lengkap & Cara kerjanya

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



0

Braingolf, 20 byte [tidak bersaing]

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

Ini tidak akan berhasil karena ketidakmampuan braingolf untuk bekerja dengan float, namun logikanya benar.

Penjelasan:

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

Berikut adalah juru bahasa yang dimodifikasi yang mendukung pelampung. Argumen pertama adalah input.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.