谐波序列的部分和!


13

定义

在数学中,调和序列是指其中

调和序列方程

即序列的n 项等于n的倒数。


介绍

在这个挑战中,给定正整数n作为输入,输出谐波序列的前n个项的部分和。


输入值

系统会为您提供一个正整数(在您的语言支持的数字范围内)。它可以是有符号的和无符号的(取决于您),因为质询仅需要正整数。

您可以以任何方式接受输入,除非假定输入存在于预定义变量中。prompt()允许从文件,终端,模态窗口(在JavaScript中)等进行读取。也可以将输入作为函数参数。


输出量

您的程序应以5个有效数字的精度输出谐波序列的前n个项的总和作为浮点数(如果输出被1整除,则为整数),其中n表示输入。为了用数学术语传达相同的内容,您需要计算

前n个项的谐波序列部分和

其中n表示输入。

除了将输出写入变量之外,您可以通过任何方式输出。alert()允许写入屏幕,终端,文件,模式窗口(在JavaScript中)等。return也允许输出为函数值。


附加规则

  • 输入数字可以是0索引或1索引。您必须在帖子中指定。

  • 您不得使用内置函数来计算前n个元素的部分和。(是的,这是给您Mathematica的!)

  • 您不得滥用本机数字类型来解决问题

  • 适用标准漏洞


测试用例

测试用例假定输入为1索引

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

获胜标准

这是,因此以字节为单位的最短代码胜出!


您能给我们一些测试用例吗?
user41805

2
需要什么精度?确切的输出通常只能作为分数,但是在许多语言中,分子和分母必须是单独的数字。我们可以输出a)浮点数,b)分数或整数对c)两者之一吗?
级圣河在

2
@Arjun调和数列增长到无穷大,所以当数字成千上万时,将很难满足10位小数。我会使用有效数字而不是小数位,而且我认为不需要这么精确。5个有效数字就足够了。因此9.9999E10而不是99999999999.9999999999
级别圣河

我们能否超过5个有效数字?
暴民埃里克(Erik the Outgolfer)'17年

顺便说一下,众所周知,谐波序列除初始a_1 = 1之外不包含任何整数。(证明n大于1的a_n不是整数的想法:令2 ^ k是2的最大幂且不超过n;然后2 ^ k除以a_n的分母。)
格雷格·马丁

Answers:



9

Python 3,27个字节

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

0索引还是1索引?
Arjun

2
RuntimeError处理大于递归限制的输入时抛出,默认为1000。
sagiksp

你可以做sys.setrecursionlimit(473755252663)的,但堆栈最终会溢出很容易

@Arjun,它被1编入索引
shooqie

8

JavaScript,19 18字节

@RickHitchcock节省了1个字节

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不错的一个!
user41805

6

APL(Dyalog),5个字节

+/÷∘⍳

在线尝试!

您可以添加⎕PP←{number}标题,以将精度更改为{number}

这是1索引的。

说明

+/÷∘⍳                     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字节

该解决方案是1索引的。

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

它是1分度
J42161217

1
>不得使用内置函数来计算前n个元素的部分和。(是的,这是给您Mathematica的!)
MCCCS

4
OP表示我不能使用HarmonicNumber [#]和
J42161217

4
而且可以进一步缩短为Tr[1./Range@#]&
格雷格·马丁

2
@Ian Mathematica可能显示 5个信号图,但是该函数返回机器精度数字(52个二进制位或精度的16位十进制数字以下)
LLlAMnYP '17




5

Japt -x8 6 5 3个字节

õpJ

感谢ETHproductions

在线尝试


0索引还是1索引?
Arjun

我认为您可以使用õ x@1/X
ETHproductions

...以及另外两个字节,XpJ而不是使用1/X:-)
ETHproductions's

谢谢@ETHproductions :)我一走开就对那些树枝进行了细化。
毛茸茸的

实际上,我不认为您甚至不需要_自动功能。我真的应该写这个小贴士:P(由于今天是阵亡将士纪念日,所以我应该在今天或明天有时间)
ETHproductions '17

4

CJam11个10字节

多亏了Erik the outgolfer,删除了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
暴民埃里克(Erik the Outgolfer)'17年

@EriktheOutgolfer已经超越了自己:-)
路易斯·门多

@LuisMendo我喜欢我的名字,那只是一个名字。是的,在帮助其他高尔夫球手打高尔夫的过程中,我超越了自己。
暴民埃里克(Erik the Outgolfer)'17年

@Erik这是个玩笑。感谢您的帮助
路易斯·门多



3

Tcl 38字节

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

这是一个非常肮脏的技巧,递归调用将传递诸如“ 5-1-1-1 ...”之类的文字字符串,直到其求值为0。


感谢@Christopher进行格式化。这样,就不再需要重复反斜杠了。
avl42

没问题!看起来更好
Christopher's


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)的参数,并返回“ Any”,表示sys将其转换(或未转换)为对下一个函数arg有用的类型(最后看起来如此,请参见以下示例)

(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&+

由于Braingolf无法使用浮点运算,因此这实际上不起作用,但是逻辑是正确的。

说明:

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

这是一个支持浮点数的修改后的解释器。输入第一个参数。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.