e的近似值


21

我们都知道,用麦克劳林级数展开式可以近似地表示出用e表示的欧拉数对某些变量x的幂次:

Maclaurin系列扩展e ^ x

通过让x等于1,我们得到

Maclaurin系列扩展e

挑战

通过输入N,以任何近似欧拉数的语言编写程序,并计算第N个项的级数。注意,第一项的分母为0 !,而不是1 !,即N = 1对应于1/0!。

计分

字节数最少的程序获胜。


7
给定足够大N的结果,如果使用有限精度的浮点数,结果将相同。这种行为是否可以接受,或者随着N接近无穷大,结果是否必须逐渐变得更加准确?
FryAmTheEggman

12
一些测试用例会很整洁。
林恩

7
(这类问题最好在沙盒中解决-如果您先在此发布挑战,高尔夫球手会提供有用的反馈。)
Lynn

2
x ^ n是第n个项还是第(n + 1)个项?
msh210 '16

4
我个人鄙视它,但是有些人将索引0处的项称为零项。独立于我们对此事的看法,这个问题应尽可能明确。另外,一些测试用例可以验证解决方案是否正常工作,将非常有帮助。
丹尼斯

Answers:



13

Wistful-C -336字节

我的第一个真正的渴望程序!实际上,我做了一点打高尔夫球,使用someday代替,wait for因为第一次打高尔夫球的长度较短。

if only <stdio.h> were included...
if only int f were 1...
if only int N were 0...
wish for "%d",&N upon a star
if only int i were 0...
if only double e were 0...
someday i will be N...
        if only e were e+1./f...
        if only i were i+1...
        if only f were f*i...
*sigh*
wish "%f\n",e upon a star
if wishes were horses...

有人告诉我您不需要包括<stdio.h>
Leaky Nun

是否someday i were N...工作,而不是someday i will be N...
Leaky Nun


9

TI-84 BASIC,12 15 14

Input N
Σ(A!⁻¹,A,0,N

TI是一种标记化语言(字节是通过标记计数的,而不是单个字符)。


1
引用的元帖子有11个赞成票和10个反对票。那不是共识。Ans不是有效的输入格式,因此仅15字节版本有效。
Mego

很公平; 编辑中…
无名称

1
Ans一直是PPCG的默认输入格式(查看我以前的TI答案),更多的人同意而不是不同意,因此不要欺负您更改答案。
Timtech '16

2
@MickLH这不是这里的争议。此外,这些是8位字节。
hobbs

1
@Timtech虽然我同意您的意见,但Mego表示社区共识已定义。
科纳·奥布莱恩

9

朱莉娅28 27 21字节

n->sum(1./gamma(1:n))

这是一个接受整数并返回浮点数的匿名函数。要调用它,请将其分配给变量。

该方法非常简单。我们用sum1除以在1到n的每一个处评估的伽马函数。这利用了属性n!=Γ(n +1)。

在线尝试!

感谢Dennis,节省了1个字节;感谢Glen O,节省了6个字节!


在MATLAB中几乎完全一样:@(n)sum(1./factorial(0:n))
漏洞

6

Python,36个字节

Python 2:

f=lambda n,i=1:n/i and 1.+f(n,i+1)/i

Python 3:

f=lambda n,i=1:i<=n and 1+f(n,i+1)/i

Python 3的变种可以用较短的or,而不是andf=lambda n,i=1:i>=n or 1+f(n,i+1)/i
构造函数

6

dc,43个字节

[d1-d1<f*]sf[dlfx1r/r1-d1<e+]se1?dk1-d1<e+p

这是该系列的相当直接的翻译。我试图变得更聪明,但这导致了更长的代码。

说明

[d1-d1<f*]sf

一个简单的阶乘函数,n> 0

[dlfx1r/r1-d1<e+]se

对n,...,1执行阶乘; 求和

1?dk1-

用1填充堆栈;接受输入并设置适当的精度

d1<e+

如果输入是0或1,我们可以继续传递,否则计算部分和。

p

打印结果。

检测结果

前100个扩展:

0
1
2
2.500
2.6666
2.70832
2.716665
2.7180553
2.71825394
2.718278766
2.7182815251
2.71828180110
2.718281826194
2.7182818282857
2.71828182844671
2.718281828458223
2.7182818284589936
2.71828182845904216
2.718281828459045062
2.7182818284590452257
2.71828182845904523484
2.718281828459045235331
2.7182818284590452353584
2.71828182845904523536012
2.718281828459045235360273
2.7182818284590452353602862
2.71828182845904523536028736
2.718281828459045235360287457
2.7182818284590452353602874700
2.71828182845904523536028747123
2.718281828459045235360287471339
2.7182818284590452353602874713514
2.71828182845904523536028747135253
2.718281828459045235360287471352649
2.7182818284590452353602874713526606
2.71828182845904523536028747135266232
2.718281828459045235360287471352662481
2.7182818284590452353602874713526624964
2.71828182845904523536028747135266249759
2.718281828459045235360287471352662497738
2.7182818284590452353602874713526624977552
2.71828182845904523536028747135266249775705
2.718281828459045235360287471352662497757231
2.7182818284590452353602874713526624977572453
2.71828182845904523536028747135266249775724691
2.718281828459045235360287471352662497757247074
2.7182818284590452353602874713526624977572470919
2.71828182845904523536028747135266249775724709352
2.718281828459045235360287471352662497757247093683
2.7182818284590452353602874713526624977572470936984
2.71828182845904523536028747135266249775724709369978
2.718281828459045235360287471352662497757247093699940
2.7182818284590452353602874713526624977572470936999574
2.71828182845904523536028747135266249775724709369995936
2.718281828459045235360287471352662497757247093699959554
2.7182818284590452353602874713526624977572470936999595729
2.71828182845904523536028747135266249775724709369995957475
2.718281828459045235360287471352662497757247093699959574944
2.7182818284590452353602874713526624977572470936999595749646
2.71828182845904523536028747135266249775724709369995957496673
2.718281828459045235360287471352662497757247093699959574966943
2.7182818284590452353602874713526624977572470936999595749669652
2.71828182845904523536028747135266249775724709369995957496696740
2.718281828459045235360287471352662497757247093699959574966967601
2.7182818284590452353602874713526624977572470936999595749669676254
2.71828182845904523536028747135266249775724709369995957496696762747
2.718281828459045235360287471352662497757247093699959574966967627699
2.7182818284590452353602874713526624977572470936999595749669676277220
2.71828182845904523536028747135266249775724709369995957496696762772386
2.718281828459045235360287471352662497757247093699959574966967627724050
2.7182818284590452353602874713526624977572470936999595749669676277240739
2.71828182845904523536028747135266249775724709369995957496696762772407632
2.718281828459045235360287471352662497757247093699959574966967627724076601
2.7182818284590452353602874713526624977572470936999595749669676277240766277
2.71828182845904523536028747135266249775724709369995957496696762772407663006
2.718281828459045235360287471352662497757247093699959574966967627724076630325
2.7182818284590452353602874713526624977572470936999595749669676277240766303508
2.71828182845904523536028747135266249775724709369995957496696762772407663035328
2.718281828459045235360287471352662497757247093699959574966967627724076630353518
2.7182818284590452353602874713526624977572470936999595749669676277240766303535449
2.71828182845904523536028747135266249775724709369995957496696762772407663035354729
2.718281828459045235360287471352662497757247093699959574966967627724076630353547565
2.7182818284590452353602874713526624977572470936999595749669676277240766303535475915
2.71828182845904523536028747135266249775724709369995957496696762772407663035354759429
2.718281828459045235360287471352662497757247093699959574966967627724076630353547594542
2.7182818284590452353602874713526624977572470936999595749669676277240766303535475945681
2.71828182845904523536028747135266249775724709369995957496696762772407663035354759457111
2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571352
2.7182818284590452353602874713526624977572470936999595749669676277240766303535475945713792
2.71828182845904523536028747135266249775724709369995957496696762772407663035354759457138185
2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571382143
2.7182818284590452353602874713526624977572470936999595749669676277240766303535475945713821752
2.71828182845904523536028747135266249775724709369995957496696762772407663035354759457138217826
2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571382178492
2.7182818284590452353602874713526624977572470936999595749669676277240766303535475945713821785218
2.71828182845904523536028747135266249775724709369995957496696762772407663035354759457138217852481
2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571382178525131
2.7182818284590452353602874713526624977572470936999595749669676277240766303535475945713821785251635
2.71828182845904523536028747135266249775724709369995957496696762772407663035354759457138217852516607
2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571382178525166394

使用1000个字词:

2.7182818284590452353602874713526624977572470936999595749669676277240\
766303535475945713821785251664274274663919320030599218174135966290435\
729003342952605956307381323286279434907632338298807531952510190115738\
341879307021540891499348841675092447614606680822648001684774118537423\
454424371075390777449920695517027618386062613313845830007520449338265\
602976067371132007093287091274437470472306969772093101416928368190255\
151086574637721112523897844250569536967707854499699679468644549059879\
316368892300987931277361782154249992295763514822082698951936680331825\
288693984964651058209392398294887933203625094431173012381970684161403\
970198376793206832823764648042953118023287825098194558153017567173613\
320698112509961818815930416903515988885193458072738667385894228792284\
998920868058257492796104841984443634632449684875602336248270419786232\
090021609902353043699418491463140934317381436405462531520961836908887\
070167683964243781405927145635490613031072085103837505101157477041718\
986106873969655212671546889570350116

5

J,10个字节

[:+/%@!@i.

直截了当的方法。

说明

[:+/%@!@i.    Input: n
        i.    Creates the range [0, 1, ..., n-1]
      !@      Maps factorial to each
    %@        Map 1/x to each
[:+/          Take the sum of the values and return it

真好 1字节微不足道的改善:1#.%@!@i.
约拿

4

CJam,11岁

r~,:m!Wf#:+

要么

r~{m!W#}%:+

在线尝试:第一个版本第二个版本

说明:

r~=读取并求值
m!=阶乘
W#=提升到-1的幂(W= -1)
:+=数组的总和
第一个版本构造[0…N-1]数组,并将阶乘和逆应用于所有元素;第二版对每个数字进行阶乘和逆,然后将它们放入数组中。


4

JavaScript ES6、44 42 40

n=>{for(k=s=m=1;m<n;s+=k/=m++);return s}

现在未命名的函数。

感谢您保存2个字节@AlexA,并感谢@LeakyNun另外2个字节!


n=>{for(k=s=m=1;m<n;s+=k/=m++);return s}
Leaky Nun

4

MATL,11个 7字节

:Ygl_^s

@Luis建议使用gammaYg),节省了4个字节

在线尝试

说明

        % Implicitly grab input (N)
:       % Create an array from 1...N
Yg      % Compute factorial(x-1) for each element (x) in the array
l_^     % Take the inverse
s       % Sum all elements
        % Implicitly display the result

您可以删除]
Luis Mendo,2016年

此外,1i:Yg/s对于7个字节
Luis Mendo

@LuisMendo哦,是的,我希望有一个更好的方法来获得阶乘,但我已经忘记了伽玛。将很快更新
-Suever

4

MATL,6个字节

q_t1Zh

这使用超几何函数 1 F 1a ; b ; z)计算总和:

在此处输入图片说明

工程于八度和在线编译器,而不是基于Matlab,由于差异在超几何函数是如何定义的(这会被纠正)。

在线尝试!

说明

q_    % Take N implicitly. Compute -N+1
t     % Duplicate
1     % Push 1
Zh    % Hypergeometric function 1F1(-N+1;-N+1;1). Implicitly display

4

C,249字节

#include <stdio.h>
#include <stdlib.h>
#define z double
z f(z x){z r=1;z n=1;while(x>0){r*=n;n++;x--;}return r;}int main(int argc, char **argv){z e=0;z p=0;z d=0;p=strtod(argv[1],NULL);while(p>0){e+=1.0d/f(d);printf("%.10f\n",e);p--;d++;}return 0;}

取消高尔夫:

/* approximate e */

#include <stdio.h>
#include <stdlib.h>

double fact(double x){
    double result = 1;
    double num = 1;

    while (x > 0){
        result *= num;
        num++;
        x--;
    }
    return result;
}

int main(int argc, char **argv){
    double e = 0;
    double precision = 0;
    double denom = 0;

    precision = strtod(argv[1], NULL);
    while (precision > 0){
        e += 1.0d / fact(denom);
        printf("%.10f\n", e);
        precision--;
        denom++;
    }
    return 0;
}

以数字作为参数来确定迭代次数。


您好,欢迎来到PPCG!很棒的第一篇文章!
NoOneIsHere16年

欢迎来到编程难题和代码高尔夫球!我认为该程序仅用于打印最后的近似值。至少在GCC中,您不需要intbefore main和the return 0。另外,如果您替换NULL0,则不需要包含。argcargv可以简化为单字母变量。如果您喜欢在C中打高尔夫球,则可能会发现有关C中打高尔夫球的技巧
丹尼斯

恕我直言,即使编译器抛出一些警告但仍返回正确的结果,您也可以将代码的许多部分扔掉,以至于没有任何错误可以减少。
安德烈KOSTYRKA

而且您不需要#include <stdio.h>
Leaky Nun


3

05AB1E,6个字节

$L<!/O

讲解

$           # push 1 and input: N = 5
 L<         # range [0..N-1]: [0,1,2,3,4]
   !        # factorial over range [1,1,2,6,24]
    /       # divide 1/range: [1.0, 1.0, 0.5, 0.16666666666666666, 0.041666666666666664]
     O      # sum: 2.708333333333333

在线尝试


1
的5个字节L<!zO
格林尼米


3

JavaScript(ES6),28个字节

f=(n,i=1)=>n&&1+f(n-1,i+1)/i


3

Haskell,37个字节

((scanl(+)0$(1/)<$>scanl(*)1[1..])!!)

不是最短的,但可以说是最漂亮的。


同样由Laikoni提供,这里的解决方案要短2个字节

sum.(`take`((1/)<$>scanl(*)1[1..]))

λ> let f = ((scanl (+) 0 $ (1/) <$> scanl (*) 1 [1..]) !!)

λ> map f [1..5]
[1.0,2.0,2.5,2.6666666666666665,2.708333333333333]

λ> f 10
2.7182815255731922

λ> f 100
2.7182818284590455

λ> log (f 10)
0.9999998885745155

λ> log (f 100)
1.0

2
您可以使用此UTF-8字节计数器。我建议编辑以添加您的字节数,即50。要添加标题,请使用:## Language, <xxx> bytes
NoOneIsHere16年

1
您需要空格吗?
NoOneIsHere16年

1
您不能假定输入出现在变量中,因此您需要添加前缀f n=\n->获取有效的函数提交。但是,我们还可以节省一些字节:(\x->1/x)可以缩短为section (1/)[1,2..][1..]map(...)$可以相同(...)<$>。共有36个字节:在线尝试!
Laikoni

1
转换为无点功能会节省另一个字节:在线尝试!即使更长,((scanl(+)0$(1/)<$>scanl(*)1[1..])!!)看起来也不错。
Laikoni '18

1
如您所见,不带括号的版本在其后插入值时只是一个有效的Haskell表达式,但是假设不允许输入出现在预定义变量中,则必须添加括号或再次\n->创建一个前导一个功能。
Laikoni '18

3

APL(Dyalog Unicode),5个字节

⍳⊥⊢÷!

在线尝试!

使用另一个挑战的答案中发现的混合基础技巧。用途⎕IO←0

怎么运行的

⍳⊥⊢÷!  Right argument: n, the number of terms
  ⊢÷!  v: 1÷(n-1)!
      B: The array of 0 .. n-1
      Expand v to length-n array V,
       then mixed base conversion of V in base B

Base | Digit | Value
--------------------
0    | v     | v×(1×2×..×(n-1)) = 1÷0!
1    | v     | v×(2×3×..×(n-1)) = 1÷1!
2    | v     | v×(3×..×(n-1))   = 1÷2!
..   | ..    | ..
n-2  | v     | v×(n-1)          = 1÷(n-2)!
n-1  | v     | v                = 1÷(n-1)!

10k rep!现在看看我是否可以在Turing Machine中完成此操作。–
ouflak

好的答案,但是我很难看到1÷(n-1)!数字是多少?您可以将其翻译成J来阐明吗?
约拿

2

其实是6个位元组

r♂!♂ìΣ

在线尝试!

说明:

r♂!♂ìΣ
r       range(N) ([0, N-1])
 ♂!     factorial of each element
   ♂ì   reciprocal of each element
     Σ  sum

2

Brachylog,18个字节

:1-:0r:ef:$!a:/a+.

说明

:1-                 Subtract 1 from Input
   :0r              Create the list [0, Input - 1]
      :ef           Find all integers between 0 and Input - 1
         :$!a       Apply factorial to each member of that list
             :/a    Apply inverse to each element of that list
                +.  Unify the output with the sum of the list

2

枫18岁

add(1/i!,i=0..n-1)

用法:

> f:=n->add(1/i!,i=0..n-1);
> f(1);
  1
> f(4);
  8/3

我认为函数是n-> add(1 / i!,i = 0..n-1)
RosLuP


2

与Java 十英尺激光杆238个 236字节

import sj224.tflp.math.*;interface U{static void main(String[]a){BigRational r=null,s,t;r=s=t=r.ONE;for(int n=new java.util.Scanner(System.in).nextInt()-1;n-->0;){t=t.multiply(r);s=s.add(t.pow(-1));r=r.add(r.ONE);}System.out.print(s);}}

具有比其他大多数答案更好的防溢性能。对于100个字,结果是

31710869445015912176908843526535027555643447320787267779096898248431156738548305814867560678144006224158425966541000436701189187481211772088720561290395499/11665776930493019085212404857033337561339496033047702683574120486902199999153739451117682997019564785781712240103402969781398151364608000000000000000000000

2

朱莉娅,28个字节

~k=k<1?1:1/gamma(k+1)+~(k-1)

说明

~k=                    #Define ~ to be
    k<1                #If k is less than 1
        ?1             #to be one
        :1/gamma(k+1)  #else add the reciprocal factorial to 
            +~(k-1)    #the function applied to the predecessor value

gamma(k+1)factorial(k)对于正整数输入等于,并针对非负整数以外的所有值将其推广。它保存一个字节,为什么不使用它呢?


1

MATLAB /八度,22字节

@(x)sum(1./gamma(1:x))

创建一个ans可以使用调用的匿名函数ans(N)

此解决方案gamma(x)为数组[1 ... N]中的每个元素计算等于factorial(x-1)。然后,我们将每个元素取反,并对所有元素求和。

在线演示


1

Perl 5,37个字节

不是赢家,而是友善而直接:

$e=$p=1;$e+=1/($p*=$_)for 1..<>;say$e

输入从0到10的输出:

1
2
2.5
2.66666666666667
2.70833333333333
2.71666666666667
2.71805555555556
2.71825396825397
2.71827876984127
2.71828152557319
2.71828180114638


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.