約瑟夫環(huán)算法

什么是約瑟夫環(huán)呢?
約瑟夫環(huán)(約瑟夫問題)是一個數學的應用問題:已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又出列;依此規(guī)律重復下去,直到圓桌周圍的人全部出列。

image.png

例如:耶穌有13個門徒,其中有一個就是出賣耶穌的叛徒,請用排除法找出這位叛徒:13人圍坐一圈,從第一個開始報號:1,2,3,1,2,3…。凡是報到“3”就退出圈子,最后留在圈子內的人就是出賣耶穌的叛徒。
思路:

  1. 首先假設,當數字為1的時候則表示活著的人,0為死了,這樣我們就可以用數組來表示;
  2. 要考慮的幾個問題,要形成一個環(huán),就是說報數到第十三人的時候,從頭開始報數;
  3. 報數為3的時候,那個人退出游戲,這里假設死了,數值為0;
  4. 還有一個問題,就是當報數到第四個人的時候,因為第三個人‘死了’,所以第四個人要從1開始報數;
    5.當最后只剩下一個人的時候,則結束。
<script>
    var arr = [1,1,1,1,1,1,1,1,1,1,1,1,1];
    var count = 0;
    var num = 0;
    for(var i=0;i<arr.length;i++){
        // 判斷活著
        if(arr[i]==1){
            // 開始計數
            count++;
            // 當報數到第四個的時候,從第一個開始報數
            if(count==4){
                count = 1;
            }
            // 當報數報到第三個人的時候,第三個人就死了
            if(count == 3){
                arr[i]=0;
                num++;
                // 當計數到最后的時候,游戲結束
                if(num == arr.length-1){
                    break;
                }
            }
        }
        // 當數到最后一個人的時候,從第一個人重頭數,如果i=0的時候,i++就變成了2,所以i要為0
        if(i==arr.length-1){
            i = -1;
        }
    }
    console.log(arr);
</script>

結果:

1.png

過了兩年,學習了數據結構,用隊列解決這種問題再簡單不過,特此補上

// 思路: 定義一個隊列,隊列先進先出,故先進來的數字先出去,再定義個index用來記錄當前元素在隊列中的位置,位置是3的倍數,則刪除
  function isPt(arr) {
    let queue = [];
    let index = 0;
    for (let i = 0; i < arr.length; i++) {
      queue.push(arr[i]);
    }
    while (queue.length !== 1) {
      let item = queue.shift();  // 將環(huán)中數據一一刪除
      index += 1;
      if (index % 3 !== 0) { // 不是3的倍數,再從環(huán)尾加入
        queue.push(item);
      }
    }
    return queue[0];
  }
  // 測試
  let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13];
  isPt(arr);
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 百度百科: 約瑟夫環(huán)(約瑟夫問題)是一個數學的應用問題:已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓...
    KPort閱讀 3,978評論 0 4
  • 第n個出列 ? ---> 0(**) 從上面可以總結規(guī)律: 1. f(*) = (f(**)+m)%n n指當前未...
    貧僧吃豬蹄閱讀 949評論 0 0
  • 我是一個微信編輯,就是那種編輯整理生活類信息、偶爾轉載別人優(yōu)秀文章的微信小編輯。每天早上看每條微信的閱讀量是我的習...
    冰糖陳皮閱讀 3,143評論 4 9
  • 有個人問慧海禪師:“禪師,你可有什么與眾不同的地方?” 慧海答:“有” “是什么呢?” 慧海答:“我感覺餓的時候就...
    流年逝水不在閱讀 173評論 2 0

友情鏈接更多精彩內容