Aproximação de e


21

Todos sabemos que o número de Euler , indicado por e, à potência de alguma variável x, pode ser aproximado usando a expansão da série Maclaurin :

Expansão da série Maclaurin de e ^ x

Ao deixar x igual a 1, obtemos

Expansão da série Maclaurin de e

Desafio

Escreva um programa em qualquer idioma que se aproxime do número de Euler, inserindo uma entrada N e calculando a série para o nono termo. Observe que o primeiro termo tem denominador 0 !, não 1 !, ou seja, N = 1 corresponde a 1/0 !.

Pontuação

Programa com menos quantidade de bytes ganhos.


7
NSe forem suficientemente grandes, os resultados serão os mesmos se você usar um número de ponto flutuante de precisão finita. Esse comportamento é aceitável ou o resultado precisa ficar progressivamente mais preciso à medida que se Naproxima do infinito?
FryAmTheEggman

12
Alguns casos de teste seriam legais.
Lynn

7
(Esse tipo de problema é resolvido preferencialmente na sandbox - se você postar seus desafios primeiro, os golfistas darão um feedback útil.)
Lynn

2
X ^ n é o enésimo termo ou (n + 1) ésima?
msh210

4
Eu pessoalmente o desprezo, mas há pessoas que se referem ao termo no índice 0 como termo zero. Independentemente de nossos pensamentos sobre esse assunto, a questão deve ser o mais clara possível. Além disso, alguns casos de teste para verificar se as soluções estão funcionando corretamente seriam muito úteis.
Dennis

Respostas:



13

Wistful-C - 336 bytes

Meu primeiro programa de verdade! Na verdade, eu pratiquei um pouco de golfe, usando ao somedayinvés de wait forporque o primeiro tinha um comprimento menor.

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

Disseram-me que você não precisa incluir #<stdio.h>
Leaky Nun

Funciona em someday i were N...vez de someday i will be N...?
Freira vazando


9

TI-84 BASIC, 12 15 14

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

A TI é um idioma tokenizado (os bytes são contados por tokens , não por caracteres individuais).


11
O meta post citado possui 11 votos positivos e 10 negativos. Isso não é um consenso. Ansnão é um formato de entrada válido, portanto, apenas a versão de 15 bytes é válida.
Mego #

justo; editando ...
No Name

11
Anssempre foi o formato de entrada padrão aqui no PPCG (veja minhas antigas respostas de TI) e mais pessoas concordam que não concordam com isso, portanto, não se intimide em alterar sua resposta.
Timtech

2
@MickLH, essa não é a disputa aqui. Além disso, são bytes de 8 bits.
hobbs

11
@ Timtech Embora eu concorde com você, o consenso da comunidade é definido como diz Mego.
Conor O'Brien

9

Julia, 28 27 21 bytes

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

Esta é uma função anônima que aceita um número inteiro e retorna um número flutuante. Para chamá-lo, atribua-o a uma variável.

A abordagem é bastante direta. Nós sum1 dividido pela função gama avaliada em cada um de 1 a n . Isso tira proveito da propriedade n ! = Γ ( n +1).

Experimente online!

Guardou 1 byte graças a Dennis e 6 graças a Glen O!


Quase exatamente o mesmo em MATLAB:@(n)sum(1./factorial(0:n))
flawr

6

Python, 36 bytes

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 variante poderia ser mais curto com orem vez de and: f=lambda n,i=1:i>=n or 1+f(n,i+1)/i.
Construtor

6

dc, 43 bytes

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

Esta é uma tradução bastante direta da série. Tentei ser mais inteligente, mas isso resultou em um código mais longo.

Explicação

[d1-d1<f*]sf

Uma função fatorial simples, para n> 0

[dlfx1r/r1-d1<e+]se

Execute o fatorial para n, ..., 1; inverter e somar

1?dk1-

Prepare a pilha com 1; aceite a entrada e defina uma precisão apropriada

d1<e+

Se a entrada foi 0 ou 1, podemos apenas transmiti-la, senão calcular a soma parcial.

p

Imprima o resultado.

Resultado dos testes

As 100 primeiras expansões:

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

Usando 1000 termos:

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

5

J, 10 bytes

[:+/%@!@i.

Abordagem direta.

Explicação

[:+/%@!@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

Agradável. Melhoria trivial de 1 byte:1#.%@!@i.
Jonah

4

CJam, 11

r~,:m!Wf#:+

ou

r~{m!W#}%:+

Experimente online: primeira versão e segunda versão

Explicação:

r~= ler e avaliar
m!= fatorial
W#= elevar à potência -1 ( W= -1)
:+= soma da matriz A
primeira versão constrói a matriz [0… N-1] e aplica fatorial e inversa a todos os seus elementos; A segunda versão faz fatorial e inversa para cada número e os coloca em uma matriz.


4

JavaScript ES6, 44 42 40

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

Uma função sem nome agora.

Obrigado por salvar 2 bytes @AlexA e obrigado a @LeakyNun por mais 2 bytes!


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

4

MATL, 11 7 bytes

:Ygl_^s

4 bytes salvos graças à recomendação de @ Luis de usar gamma( Yg)

Experimente Online

Explicação

        % 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

Você pode remover]
Luis Mendo

Além disso, 1i:Yg/spor 7 bytes
Luis Mendo

@LuisMendo oh sim, eu esperava que houvesse uma maneira melhor de obter um fatorial, mas eu tinha esquecido a gama. Será atualizado em breve
Suever

4

MATL , 6 bytes

q_t1Zh

Isso calcula a soma usando a função hipergeométrica 1 F 1 ( a ; b ; z ):

insira a descrição da imagem aqui

Funciona no Octave e no compilador on-line, mas não no Matlab, devido a uma diferença na forma como a função hipergeométrica é definida (que será corrigida).

Experimente online!

Explicação

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 bytes

#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;}

Ungolfed:

/* 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;
}

Leva um número como argumento para determinar o número de iterações.


Olá, e bem-vindo ao PPCG! Ótimo primeiro post!
NoOneIsHere

Bem-vindo à programação de quebra-cabeças e código de golfe! Eu acho que o programa pretende imprimir apenas a última aproximação. Pelo menos com o GCC, você não precisa do intantes maine do return 0. Além disso, se você substituir NULLpor 0, não precisará das inclusões. argce argvpode ser reduzido para variáveis ​​de letra única. Se você gosta de golfe em C, você pode encontrar dicas para golfe em C útil.
217 Dennis

IMHO, mesmo que o compilador emita alguns avisos, mas retorne o resultado correto, você pode jogar fora muitas partes do seu código a tal ponto que nada poderia ser reduzido sem um erro.
Andreï Kostyrka

E você não precisa#include <stdio.h>
Leaky Nun

3

k (13 bytes)

Sujeito a estouros para N>20

{+/%*\1,1+!x}

3

05AB1E, 6 bytes

$L<!/O

Explicado

$           # 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

Experimente online


11
5 bytes com L<!zO.
Grimmy 25/09

3

Pyke, 10 bytes

FSBQi^R/)s

Experimente aqui!

Ou 8 bytes se poder = 1

FSB1R/)s

Experimente aqui!


o primeiro código foi desativado em mais de 3 quando o executei: 5.436532738095238
tox123

@ tox123 corrigido agora
Blue

você está testando isso? Eu tenho: 7.3887125220458545 para o primeiro, o segundo funciona muito melhor.
tox123

Esse é um e ^ x que você conhece não apenas e
Blue

esse não é o desafio.
tox123

3

JavaScript (ES6), 28 bytes

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

3

Dyalog APL , 6 bytes

+/÷!⍳⎕

+/soma dos
÷recíprocos dos
!fatoriais dos
números de 0 a
entrada numérica

Supõe ⎕IO←0, que é padrão em muitos sistemas.

TryAPL !


3

Haskell, 37 bytes

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

Não é o mais curto, mas sem dúvida o mais bonito.


Também cortesia de Laikoni , aqui está uma solução que é 2 bytes mais curta:

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
Você pode usar este contador de bytes UTF-8 . Coloquei uma edição sugerida para adicionar sua contagem de bytes, que é 50. Para adicionar um cabeçalho, use: ## Language, <xxx> bytes.
NoOneIsHere

11
Você precisa do espaço em branco?
NoOneIsHere

11
Você não pode presumir que a entrada esteja presente em uma variável; portanto, você precisa pré-anexar f n=ou \n->obter um envio de função válido. No entanto, também podemos salvar alguns bytes: (\x->1/x)pode ser reduzido para a seção (1/), [1,2..]é o mesmo que [1..]e map(...)$pode ser (...)<$>. Juntos 36 bytes: Experimente online!
Laikoni

11
A conversão para uma função sem ponto economiza outro byte: Experimente online! E mesmo que seja um byte mais longo, ((scanl(+)0$(1/)<$>scanl(*)1[1..])!!)parece bom também.
Laikoni

11
Como você se viu a versão sem parênteses é apenas uma expressão Haskell válida ao inserir um valor após ele, mas como assumindo que a entrada presente em uma variável predefinida não é permitida , você deve adicionar os parênteses ou novamente um líder \n->para criar uma função.
Laikoni

3

APL (Dyalog Unicode) , 5 bytes

⍳⊥⊢÷!

Experimente online!

Usando o truque de base mista encontrado na minha resposta de outro desafio . Usos⎕IO←0 .

Como funciona

⍳⊥⊢÷!  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! Agora, para ver se consigo fazer isso na Turing Machine ...
ouflak 15/11

Boa resposta, mas estou tendo problemas para ver como 1÷(n-1)!é um dígito? Você poderia traduzi-lo em J para esclarecer?
Jonah

2

Na verdade, 6 bytes

r♂!♂ìΣ

Experimente online!

Explicação:

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

2

Braquilog , 18 bytes

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

Explicação

: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

Maple, 18

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

Uso:

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

Eu acho que a função é n-> add (1 / i!, I = 0..n-1)
RosLuP 14/11


2

Java com pólo a laser de dez pés , 238 236 bytes

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);}}

Tem muito melhor resistência a transbordamento do que a maioria das outras respostas. Por 100 termos, o resultado é

31710869445015912176908843526535027555643447320787267779096898248431156738548305814867560678144006224158425966541000436701189187481211772088720561290395499/11665776930493019085212404857033337561339496033047702683574120486902199999153739451117682997019564785781712240103402969781398151364608000000000000000000000

2

Julia, 28 bytes

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

Explicação

~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)é igual a factorial(k)para entradas inteiras positivas e o generaliza para todos os valores, exceto os inteiros não negativos. Ele economiza um byte, então por que não usá-lo?


1

MATLAB / oitava, 22 bytes

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

Cria uma função anônima chamada ansque pode ser chamada usando ans(N).

Esta solução calcula gamma(x)para cada elemento na matriz [1 ... N] que é igual a factorial(x-1). Em seguida, tomamos o inverso de cada elemento e somamos todos os elementos.

Demo Online


1

Perl 5, 37 bytes

Não é um vencedor, mas agradável e direto:

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

Saídas para entradas de 0 a 10:

1
2
2.5
2.66666666666667
2.70833333333333
2.71666666666667
2.71805555555556
2.71825396825397
2.71827876984127
2.71828152557319
2.71828180114638

1

R, 17 bytes

sum(1/gamma(1:n))

Muito simples, embora problemas de precisão numérica devam surgir em algum momento.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.