Часткова сума послідовності гармоній!


13

Визначення

У математиці « Гармонічна послідовність» відноситься до послідовності, де

Рівняння гармонійної послідовності

тобто n- й член послідовності дорівнює зворотному n .


Вступ

У цьому виклику, даючи додатне ціле число n як вхідне, виведіть Часткову суму перших n доданків гармонійної послідовності.


Вхідні дані

Вам буде дано додатне ціле число (у межах чисел, підтримуваних вашою мовою). Він може бути як з підписами, так і без підпису (залежить від вас), оскільки для виклику потрібні лише додатні цілі числа.

Ви можете взяти дані будь-яким способом, за винятком припущення, що він присутній у заздалегідь визначеній змінній. Читання з файлу, терміналу, модального вікна ( prompt()в JavaScript) тощо дозволяється. Дозволено також приймати дані як аргументи функції.


Вихідні дані

Ваша програма повинна виводити суму перших n доданків гармонійної послідовності у вигляді поплавця (або цілого числа, якщо висновок рівномірно ділиться на 1) з точністю до 5 значущих цифр, де n посилається на вхід. Щоб передати те саме в математичному жаргоні, потрібно обчислити

Гармонічна послідовність Часткова сума перших російських доданків

де n посилається на вхід.

Ви можете виводити будь-яким способом, крім запису виводу в змінну. alert()Дозволяється запис на екран, термінал, файл, модальне вікно ( у JavaScript) тощо. returnДозволено також виводити як значення функції .


Додаткові правила


Випробування

Тестові випадки передбачають, що вхід має 1-індексацію

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

Критерій виграшу

Це , тому найкоротший код у байтах виграє!


Не могли б ви дати нам кілька тестів?
користувач41805

2
Яка точність потрібна? Точний вихід, як правило, можливий лише у вигляді дробу, але для багатьох мов, які повинні бути окремими числами для чисельника та знаменника. Чи можемо ми вивести а) поплавок, б) дріб чи цілу пару в) або?
Рівень річки Св

2
@Arjun Гармонічний ряд зростає до нескінченності, тому буде важко зустріти 10 десяткових знаків, коли число потрапить у тисячі та мільйони. Я б хотів отримати значні цифри, а не десяткові знаки, і я не бачу необхідності бути настільки точним. 5 значущих цифр має бути достатньо. так, 9.9999E10а не99999999999.9999999999
рівень річки Св

Чи можемо ми перейти понад 5 значущих цифр?
Ерік Аутгольфер

До речі, відомо, що гармонійна послідовність не містить жодних цілих чисел, окрім початкових a_1 = 1. (Ідея доказу, що a_n не є цілим числом для n> 1: нехай 2 ^ k є найбільшою потужністю 2, що не перевищує n; тоді 2 ^ k ділить знаменник a_n.)
Грег Мартін

Відповіді:



9

Python 3, 27 байт

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

0-індексація або 1-індексація?
Арджун

2
Кидає, RuntimeErrorколи обробка вводу перевищує межу рекурсії, 1000 за замовчуванням.
sagiksp

ви можете зробити, sys.setrecursionlimit(473755252663)але стек з часом переповниться досить легко
кіт

@Arjun це 1-індексація
shooqie

8

JavaScript, 19 18 байт

1 байт збережено завдяки @RickHitchcock

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

Це 1-індексований.

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

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


З того, що я бачив в інших публікаціях, ви можете видалити f=свою відповідь, щоб зберегти 2 байти.
Рік Хічкок

1
@RickHitchcock Я не можу видалити, f=оскільки функція є рекурсивною і вона посилається на себе f(--a). Але якби це не було рекурсивним рішенням, я міг би це зробити
user41805

Ах, має сенс! Збережіть один байт за допомогою f=a=>a&&1/a+f(--a).
Рік Хічкок

@RickHitchcock Приємний!
користувач41805


6

Математика, 21 20 16 байт

Цей розчин є 1-індексованим.

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

Це 1-індексація
J42161217

1
> Ви не повинні використовувати вбудований для обчислення часткової суми перших n елементів. (Так, це для вас Mathematica!)
MCCCS

4
OP означає, що я не можу використовувати HarmonicNumber [#] &
J42161217

4
І можна ще більше скоротити Tr[1./Range@#]&.
Грег Мартін

2
@Ian Mathematica може відображати 5 sig fig, але функція повертає точні цифри (52 двійкові біти або трохи менше 16 точних цифр точності)
LLlAMnYP




5

Japt -x , 8 6 5 3 байт

õpJ

З деякою подякою ETHproductions

Спробуйте в Інтернеті


0-індексація або 1-індексація?
Арджун

Я думаю, ви можете зберегти байт за допомогоюõ x@1/X
ETHproductions,

... та ще пару байтів, використовуючи XpJзамість 1/X:-)
ETHproductions

Дякую, @ETHproductions :) Я покрутив їх, як тільки пішов.
Кудлатий

Насправді я не думаю, що вам навіть це потрібно _через автоматичні функції. Я справді повинен написати цю пораду: P (я мав би час сьогодні чи завтра, оскільки це День пам'яті)
ETHproductions

4

CJam , 11 10 байт

1 байт вилучено завдяки Еріку, який перемагає

ri),{W#+}*

Для цього використовується індексація на основі 1.

Спробуйте в Інтернеті!

Пояснення

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

Ви можете використовувати Wзамість -1.
Ерік Аутгольфер

@EriktheOutgolfer перевершив себе :-)
Луїс Мендо

@LuisMendo Мені подобається моє ім’я, це просто ім'я. І так, я перемогла себе в процесі допомоги ще більше допомагаючи своєму гольфу в гольфі.
Ерік Аутгольфер

@Erik Це малося на увазі як жарт. Дякую за допомогу
Луїс Мендо

3

Haskell, 20 байт

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

Оригінальне рішення, 22 байти

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

Ці розчинники передбачають 1-індексований вхід.



3

Tcl 38 байт

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

Це дуже брудний злом, і рекурсивні дзвінки проходять буквальні рядки типу "5-1-1-1 ...", поки він не оцінить 0.


Дякуємо @Christopher за форматування. При цьому дублювання зворотної косої риси більше не було необхідним.
avl42

Без проблем! Це виглядає краще
Крістофер


2

MATL, 5 байт

:l_^s

Це рішення використовує індексацію на основі 1.

Спробуйте в MATL Online

Пояснення

    % 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

Аксіома, 45 34 байт

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

1-індексований; Він має аргумент одне додатне ціле число (PI) і повертає "Будь-яке", яке sys перетворює (або не конвертує) у тип, корисний для наступної аргументу функції (нарешті, здається, це бачимо нижче прикладів)

(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 байти

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

Використовує 1-індексовані числа.



1

QBIC , 13 байт

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

Пояснення

[ |        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 байт

F1LP,+|B

Спробуйте в Інтернеті!

Приклад повної програми та як вона працює

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 байт [неконкуренто]

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

Насправді це не спрацює через нездатність брайнгольфа працювати з поплавками, однак логіка правильна.

Пояснення:

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

Ось модифікований інтерпретатор, який підтримує floats. Перший аргумент - це введення.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.