2017-08-20 14 views
2

私はprimeFactorsという関数を持っています。ここでは、特定のnの除数であるすべての数を見つけようとしますが、同時にそれらは素数でなければなりません。ある意味での基本的なアルゴリズムです。要素が配列内にプッシュされるたびにオーディオ音を鳴らす

私はまた、whileステートメントがブロックをループするたびに再生されるオーディオサウンドを置くのは面白いと思っていました。しかし、場合によっては3つの要素の配列(例:[2, 7, 11])でもサウンドが1回再生されます。この場合、各要素を配列にプッシュする前に、サウンドを3回再生します。ここに私のコードです:

function primeFact(n) { 
    let factors = []; 
    let divisor = 2; 
    let clap = new Audio('clap.mp3'); 

    while (n > 2) { 
     if (n % divisor == 0) { 
      clap.currentTime = 0; 
      clap.play(); 
      factors.push(divisor); 
      n = n/divisor; 
     } else { 
      divisor++; 
     } 
    } 
    return factors; 
} 
+0

もう一度再生する前に再生を終了しますか? – SLaks

+0

@SLaksはい、それは良いでしょう。 – IsaaK08

答えて

3

キューを使用することができます。そのループではほとんど瞬間的なので、サウンドは1つしか再生されません。これは動作します:

<script> 
var sounds = new Array, 
    clap = new Audio('clap.mp3'); // no need to assign it every time 
function primeFact(n) { 
    let factors = []; 
    let divisor = 2; 

    while (n > 2) { 
     if (n % divisor == 0) { 
      clap.currentTime = 0; 
      sounds.push(clap); // add sound to queue 
      factors.push(divisor); 
      n = n/divisor; 
     } else { 
      divisor++; 
     } 
    } 
    playQueuedSounds(); // play all sounds added 
    return factors; 
} 
function playQueuedSounds() { 
    if (sounds.length === 0) return; 
    var sound = sounds.pop(); // get last sound and remove it 
    sound.play(); 
    sound.onended = function() { // go look at the queue again once current sound is finished 
     playQueuedSounds(); 
    }; 
} 
primeFact(25); // two clap noises :) 
</script> 
関連する問題