2015-12-10 10 views
9

Ben Rosalind sorunu Mortal Fibonacci Rabbits üzerinde çalışıyorum ve web sitesi benim algoritma yazılı JavaScript kullandığımda bana cevap yanlış olduğunu söylüyor tutar. Python'da aynı algoritmayı kullandığımda farklı (ve doğru) bir cevap alırım.Javascript aynı algoritma için farklı bir cevap veriyor Python

Tutarsızlık, yalnızca sonuç büyüdüğünde gerçekleşir. Örneğin fibd(90, 19), JavaScript'te 2870048561233730600 döndürür, ancak Python'da 2870048561233731259 alır.

JavaScript'te bana farklı bir yanıt veren veya JavaScript kodumda küçük bir hata yapan sayılar hakkında bir şeyler var mı?

JavaScript çözümü:

function fibd(n, m) { 
    // Create an array of length m and set all elements to 0 
    var rp = new Array(m); 
    rp = rp.map(function(e) { return 0; }); 
    rp[0] = 1; 

    for (var i = 1; i < n; i++) { 
     // prepend the sum of all elements from 1 to the end of the array 
     rp.splice(0, 0, rp.reduce(function (e, s) { return s + e; }) - rp[0]); 
     // Remove the final element 
     rp.pop(); 
    } 

    // Sum up all the elements 
    return rp.reduce(function (e, s) { return s + e; }); 
} 

Python çözüm:

def fibd(n, m): 
    # Create an array of length m and set all elements to 0 
    rp = [0] * m 
    rp[0] = 1 

    for i in range(n-1): 
     # The sum of all elements from 1 the end and dropping the final element 
     rp = [sum(rp[1:])] + rp[:-1] 

    return sum(rp) 
+0

dönecek? Kodunuzu çalıştırıyorum ve giriş için aynı sonucu veriyor (10,10). Ancak bir yazım hatası görebiliyorum "rp.splice (0, 0, rp.reduce (işlev (e, s) {return s + e;}) - rP [0]);". Bu olabilir mi? Eğer değilse, bir sapma noktası var mı? –

+0

İyi nokta. Bir örnek ekledim. Daha büyük girişlerde gerçekleşir. Yazım hatası iyi. Teşekkürler, ama sorun değil. Bu sadece değişken isimleri sözde aynı yapmaya çalışıyorum ve sadece güncellemek için bir değişken eksik. Yazım hatası şimdi düzeltildi – Cristian

cevap

13

Ben JavaScript sadece "Sayı" veri türü vardır düşünüyorum ve çift başlık altında bu aslında bir IEEE. 2,770,048,561,233,730,600, IEEE çiftinde tam olarak tutmayacak kadar büyüktür, bu nedenle yaklaşık değerlerdir. (Takip eden "00" notu - 17 ondalık basamak çift için doğrudur.)

Diğer taraftan Python bignum desteğine sahiptir ve 4096 bit tamsayılarla oldukça neşeli bir şekilde ilgilenecektir (kriptografik algoritmalarla oynayanlar için Bu büyük bir nimettir).

Sen kudreti arama eğer bir JavaScript bignum kütüphanesini bulmak mümkün olacak - örneğin

İlgili konular