Fibonacci dizisinin doğrusal enterpolasyonu


20

Göreviniz bulmaktır n inci Fibonacci sayı, fakat n mutlaka bir tamsayı değil.

0 endeksli Fibonacci dizisi aşağıdaki gibi gider:

0, 1, 2, 3, 4, 5,  6,  7, ...

1, 1, 2, 3, 5, 8, 13, 21, ...

Biz 2 istiyorsanız Ancak, ne olur .4 inci numarayı?

2.4 inci sayısı 3 ila 0.4 katı fark rd ve 2 nci Fibonacci sayıları ve 2 nci Fibonacci sayısı. Yani, 2.4 inci Fibonacci sayısıdır 2 + 0.4 * (3 – 2) = 2.4.

Benzer bir şekilde, 6.35 inci Fibonacci sayıdır 13 + 0.35 * (21 – 13) = 15.8.

Göreviniz bulmaktır n inci öyle ki, Fibonacci sayı n 0'a eşit veya daha büyüktür.

Bunu sıfır veya tek dizinli yapabilirsiniz, lütfen hangisini kullandığınızı söyleyin.

Bu , bayt en kısa kod kazanır!

Bazı örnekler:

0        1
4.5    6.5
0.7      1
7       21

2
Burada yaptığınız işleme "doğrusal enterpolasyon" denir. (Yazının başlığını bunu yansıtacak şekilde değiştirirsem sakıncası var mı?) F (n-2) + f (n-1) = f (n) olan Fibonacci özelliğine sahip gibi görünüyor, bu yüzden Fibonacci dizisinin makul bir genellemesi. (Standart bir genelleme olup olmadığından emin değilim.)

@ ais523, soruyu geliştireceğini düşünüyorsanız evet, gönderinin başlığını değiştirebilirsiniz.
Daniel

Sanırım biri benzer bir şey sorarsa soruyu gelecekte bulmayı kolaylaştıracak ve ayrıca "İlgili" listesinde ne hakkında olduğunu daha da netleştirecektir. Bu yüzden cevapları doğru yere götürerek soruyu daha iyi hale getireceğiz.

2
@ais Binet formülünde genelleme var gibi görünüyor: mathworld.wolfram.com/FibonacciNumber.html
Neil

1
Kod golf isteği (herhalde) haklı olmak zorunda olmasa da, bu garip bir işlem gibi görünüyor; ona göre, bu yana F_0 = 0ve F_2 = 1biz sahip olmalıdır F_1 = (1/2)(F_0 + F_2) = 1/2.
LSpice

Yanıtlar:


7

Jöle , 5 bayt

_Ḟ1+¡

Bu yerleşik olmayan yinelemeli bir çözümdür. Meydan okuma özelliğiyle aynı indekslemeyi kullanır.

Çevrimiçi deneyin!

Arka fon

Let f meydan spec ve tanımlanmış fonksiyonu F (yani, her zaman olduğu gibi tanımlandığı Fibonacci fonksiyonu F (0) = 0 ). Negatif olmayan bir tamsayı için n , elimizdeki f (n) = F (n + 1) . Zaman 0 ≤ x <1 , meydan spektrumu tanımlar f (n + x) olarak f (n) + (f (n + 1) - f (n)), X .

Açıkçası, bu sadece temel vakaları etkiler, ancak özyinelemeli formül değil, yani f (n) = f (n - 1) + f (n - 2) , F için olduğu gibi kalır . Bu, tamsayı olmayan argümanların tanımını daha kolay f (n) = f (n) + f (n - 1) x ile basitleştirebileceğimiz anlamına gelir .

Diğerlerinin cevaplarında belirttiği gibi, yinelemeli ilişki tamsayı olmayan argümanlar için de geçerlidir. Bu kolayca doğrulanabilir, çünkü

kanıt

Yana f (0) = f (1) = 1 , m aralığında sabiti [0, 1] ve f (0 + x) = 1 için tüm x . Ayrıca, f (-1) = F (0) = 0 , yani f (-1 + x) = f (-1) + (f (0) - f (-1)) x = 0 + 1x = x . Bu temel durumlar [-1, 1) 'i kapsar , bu nedenle özyinelemeli formülle birlikte f tanımını tamamlarlar .

Nasıl çalışır

Daha önce olduğu gibi, n + x , monadic programımızın tek argümanı olsun.

¡Bir olan hızlı bir içine sol ve dönüşler onlara bazı bağlantılar tüketir yani Quicklink . ¡özellikle bir veya iki bağlantı tüketir.

  • <F:monad|dyad><N:any>r bağlantısını döndüren N bağlantısını çağırır ve F'yi toplam r kez çalıştırır.

  • <nilad|missing><F:monad|dyad>r'yi son komut satırı argümanına (veya yokluğunda STDIN'den gelen bir girişe) ayarlar ve F'yi toplam r kez yürütür .

Yana 1bir nilad (bağımsız değişkeni olmayan bir bağlantı), ikinci durumda geçerlidir ve çalıştırır + n kat (tam sayı olmayan bir argüman yuvarlak aşağı). Her çağrıdan sonra +, hızlı bağlantının sol argümanı dönüş değeriyle, sağ argüman ise sol argümanın önceki değeriyle değiştirilir.

Tüm programa gelince , giriş katlanır, n verir ; daha sonra _sonucu girişten çıkarın, döndürme değeri olan ** x verir.

1+¡sonra - daha önce anlatıldığı gibi - istenen çıktıyı hesaplayan sol argüman 1 = f (0 + x) ve sağ argüman x = f (-1 + x) ile çağırır .


Ahh, Fibonacci zorlukları için ne kadar yararlı . ¡Dyads ile fibonacci gibi çalışmak maksatlı mıydı ?
Outgolfer Erik

Oooh - %1+¡: doğrusal enterpolasyon ile nx F (n) de , n ve n, X, F (n-1) + F (n) de , n-s arasında ve adım N-s ve n .
Jonathan Allan

@EriktheOutgolfer İyi, az çok. Jelly'in değişkenleri olmadığından, önceki dizi üyelerine erişiminizi kaybedersiniz, aksi takdirde bunu böyle uygulamak mantıklıdır.
Dennis

@JonathanAllan Anladığımdan emin değilim. Ne %1+¡yapmalı?
Dennis

@Dennis erm, demek istediğim , \ _o_ / ... ama deneme ile ilgili göründüğü gibi: D
Jonathan Allan

5

Mathematica, 32 bayt

If[#<2,1~Max~#,#0[#-1]+#0[#-2]]&

Giriş olarak negatif olmayan bir gerçek sayı alan ve gerçek bir sayı döndüren saf işlev. Eğer 1~Max~#değiştirilirse 1, bu tamsayı argümanları için 0 indeksli Fibonacci sayılarının standart özyinelemeli tanımı olacaktır. Ancak 1~Max~#0 ile 2 arasındaki gerçek girişler için doğru parçalı doğrusal işlevdir ve özyineleme geri kalanıyla ilgilenir. (Diğer bilgiler: Bunu 1 endeksli Fibonacci sayılarına değiştirmek, sadece Maxa yerine Min!

Yerleşik ile alabileceğim en kısa süre 37 bayt (b=Fibonacci)[i=Floor@#](#-i)+b[i+1]&.



3

JavaScript (ES6), 30 bayt

f=x=>x<1?1:x<2?x:f(x-1)+f(x-2)
<input type=number value=2.4 oninput="O.value=f(value)"> <input id=O value=2.4 disabled>

Sıfır indeksli özyinelemeli Fibonacci dizi tanımının önemsiz modifikasyonu. Bazı girdiler için hafif yuvarlama hataları verebilir.


Bu akıllıca. İşe yaramadığını düşündüm.
Leaky Nun

1

Jöle , 17 12 bayt

’Ñ+Ñ
’»0‘ÇỊ?

Çevrimiçi deneyin!

Yerleşik olmayan çözüm.

açıklama

Yardımcı işlevi 1Ŀ

’Ñ+Ñ
 Ñ    Call the main program on
’       {the input} - 1;
   Ñ  Call the main program on {the input};
  +   Add those results{and return the result}

Ana program

’»0‘ÇỊ?
’        Subtract 1
 »0      but replace negative results with 0
     Ị?  If the result is less than or equal to 1
   ‘     Return the result plus 1
    Ç    else return the result

Bu nedenle 0 ila 1 aralığındaki bir girdi 0'a doymuş-çıkarma yapar, bu nedenle F (0) = F (1) = 1 elde etmek için 1 ekleriz. 1 ila 2 aralığındaki bir giriş kendini döndürür. Bu baz vakalar tipik bir Fibonacci özyineleme yapmak ve oradan diğer değerleri hesaplamak için yeterlidir.


1

Excel, 137124111111220 97 Bayt

Özyinelemeli / yinelemesiz yaklaşım. (Doğrudan n. Terimleri hesapla) Bu, tek dizinli yöntemi kullanır . Eklemek +1, =TRUNC(B1)onu sıfır dizinli olarak değiştirir.

=A7+(A8-A7)*MOD(B1,1)
=5^.5
=(1+A2)/2
=TRUNC(B1)
=A4+1
=-1/A3
=(A3^A4-A6^A4)/A2
=(A3^A5-A6^A5)/A2

Kod pasajının A1 hücresinden başlayarak yerleştirilmesi amaçlanmıştır .

Giriş hücresi B1'dir . Çıkış hücresi A1'dir .


1

JavaScript (ES6), 67 64 bayt

Yuvarlama ile ilgili birkaç sorunu var

n=>(i=(g=(z,x=1,y=0)=>z?g(--z,x+y,x):y)(++n|0))+n%1*(g(++n|0)-i)

Dene

f=
n=>(i=(g=(z,x=1,y=0)=>z?g(--z,x+y,x):y)(++n|0))+n%1*(g(++n|0)-i)
console.log(f(2.4))
console.log(f(6.35))
console.log(f(42.42))



0

Jöle , 13 9 bayt

,‘ḞÆḞḅ%1$

Bu, meydan okuma özelliğiyle aynı indekslemeyi kullanır.

Çevrimiçi deneyin!

Arka fon

Spesifikasyona göre, doğal n ve 0 ≤ x <1 için F (n + x) = F (n) + (F (n + 1) - F (n)) x var . Yana F (n + 1) = F (n) + F (n - 1) , bu şekilde yeniden olabilir - x (n + x) = F (n) + F (n-1), F .

Ayrıca, meydan okuma spesifikasyonunda kullanılan indeksleme f (n) = F (n + 1) fonksiyonunu tanımlar (burada F olağan Fibonacci fonksiyonudur, yani F (0) = 0 ), bu yüzden f (n formülünü alırız) + x) = F (n + 1) + F (n) x .

Nasıl çalışır

,‘ḞÆḞḅ%1$  Main link. Argument: n + x

 ‘         Increment; yield n + 1 + x.
,          Pair; yield [n + x, n + 1 + x].
  Ḟ        Floor; yield [n, n + 1].
   ÆḞ      Fibonacci; yield [F(n), F(n + 1)].
      %1$  Modulus 1; yield (n + x) % 1 = x.
     ḅ     Unbase; yield F(n)x + F(n + 1).

0

Perl 6 ,  48  38 bayt

48

{$/=(1,1,*+*...*)[$_,$_+1];$0+($_-.Int)*($1-$0)}

Dene

38

sub f(\n){3>n??max 1,n!!f(n-1)+f(n-2)}

Dene

Expanded:

48

{
  $/ =          # store here so we can use $0 and $1
  (
    1,1,*+*...* # Fibonacci sequence
  )[
    $_,         # get the value by using floor of the input
    $_ + 1      # and get the next value
  ];

    $0            # the first value from above
  +
    ( $_ - .Int ) # the fractional part of the input
  *
    ( $1 - $0 )   # the difference between the two values in the sequence
}

( $0ve $1kısa $/[0]ve $/[1])

38

sub f (\n) {
    3 > n           # if n is below 3
  ??
    max 1, n        # return it if it is above 1, or return 1
                    # if it was below 1, the answer would be 1
                    # the result for numbers between 1 and 3
                    # would be the same as the input anyway
  !!
    f(n-1) + f(n-2) # the recursive way to get a fibonacci number
}

Bu diğer Python ve Javascript çözümlerinden ilham aldı


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.