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


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.