最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript代碼實現(xiàn)春晚劉謙魔術(shù)的模擬程序

 更新時間:2024年02月11日 08:13:31   作者:小u  
昨晚春晚上劉謙的兩個魔術(shù)表演都非常精彩,尤其是第二個魔術(shù),他演繹了經(jīng)典的約瑟夫環(huán)問題!約瑟夫環(huán)是一個經(jīng)典的數(shù)學(xué)問題,本文給出了完整的 JavaScript 代碼實現(xiàn),感興趣的同學(xué)可以自己動手實現(xiàn)一下

什么是約瑟夫環(huán)問題?

約瑟夫環(huán)(Josephus problem)是一個經(jīng)典的數(shù)學(xué)問題,最早由古羅馬歷史學(xué)家弗拉維奧·約瑟夫斯提出,但它的名字是在19世紀(jì)由德國數(shù)學(xué)家約瑟夫·喬瑟夫斯(Josef Stein)命名的。

問題的描述是這樣的:假設(shè)有n個人(編號從1到n)站成一個圓圈,從第一個人開始報數(shù),報到某個數(shù)字(例如k)的人就被殺死,然后從下一個人開始重新報數(shù)并繼續(xù)這個過程,直到只剩下一個人留下來。

問題的關(guān)鍵是找出存活下來的那個人的編號。

結(jié)合撲克牌解釋約瑟夫環(huán)問題

1、考慮最簡單的情況

假設(shè)有2張牌,編號分別是1和2。

首先將1放到后面,扔掉2。剩下的就是最開始放在最上邊的那張1。

2、稍微復(fù)雜一點的情況,牌的張數(shù)是2的n次方

比如有8張牌,編號分別是1、2、3、4、5、6、7、8。

第一輪會把2、4、6、8扔掉,剩下1、3、5、7按順序放在后面,又退化成了4張牌的情況。

第二輪會把3、7扔掉,剩下1、5按順序放在后面,又退化成了2張牌的情況。

第三輪把5扔掉,剩下1,就是最初在最前面的那張。

結(jié)論:如果牌的張數(shù)是2^n,最后剩下的一定是最開始放在牌堆頂?shù)哪菑垺?/p>

3、考慮任意的情況,牌的張數(shù)是2^n+m

比如牌的張數(shù)是11,等于8+3。把1放到后面,把2扔掉,把3放到后面,把4扔掉,把5放到后面,把6扔掉,現(xiàn)在剩下的編號序列是7、8、9、10、11、1、3、5,這又是8張牌的情況!最后一定剩下的是現(xiàn)在牌堆頂?shù)?!

因此,只要提前知道牌的張數(shù),就一定能馬上推導(dǎo)出最終是剩下哪一張牌。一切的魔法都是數(shù)學(xué)??!都是算法??!

見證奇跡的時刻!魔術(shù)的流程

  • 4張牌對折后撕開,就是8張,疊放在一起就是ABCDABCD。注意,ABCD四個數(shù)字是完全等價的。
  • 根據(jù)名字字?jǐn)?shù),把頂上的牌放到下面,但怎么放都不會改變循環(huán)序列的相對位置。譬如2次,最后變成CDABCDAB;譬如3次,最后換成DABCDABC。但無論怎么操作,第4張和第8張牌都是一樣的。
  • 把頂上3張插到中間任意位置。這一步非常重要!因為操作完之后必然出現(xiàn)第1張和第8張牌是一樣的!以名字兩個字為例,可以寫成BxxxxxxB(這里的x是其他和B不同的牌)。
  • 拿掉頂上的牌放到一邊,記為B。剩下的序列是xxxxxxB,一共7張牌。
  • 南方人/北方人/不確定,分別拿頂上的1/2/3張牌插到中間,但是不會改變剩下7張牌是xxxxxxB的結(jié)果。
  • 男生拿掉1張,女生拿掉2張。也就是男生剩下6張,女生剩下5張。分別是xxxxxB和xxxxB。
  • 循環(huán)7次,把最頂上的放到最底下,男生和女生分別會是xxxxBx和xxBxx。
  • 最后執(zhí)行約瑟夫環(huán)過程!操作到最后只剩下1張。當(dāng)牌數(shù)為6時(男生),剩下的就是第5張牌;當(dāng)牌數(shù)為5時(女生),剩下的就是第3張牌。Bingo!就是第4步拿掉的那張牌!

下面是完整的 JavaScript 代碼實現(xiàn):

// 定義一個函數(shù),用于把牌堆頂n張牌移動到末尾
function moveCardBack(n, arr) {
    // 循環(huán)n次,把隊列第一張牌放到隊列末尾
    for (let i = 0; i < n; i++) {
        const moveCard = arr.shift();  // 彈出隊頭元素,即第一張牌
        arr.push(moveCard);            // 把原隊頭元素插入到序列末尾
    }
    return arr;
}

// 定義一個函數(shù),用于把牌堆頂n張牌移動到中間的任意位置
function moveCardMiddleRandom(n, arr) {
    // 插入在arr中的的位置,隨機(jī)生成一個idx
    // 這個位置必須是在n+1到arr.length-1之間
    const idx = Math.floor(Math.random() * (arr.length - n - 1)) + n + 1;
    // 執(zhí)行插入操作
    const newArr = arr.slice(n, idx).concat(arr.slice(0, n)).concat(arr.slice(idx));
    return newArr;
}

// 步驟1:初始化8張牌,假設(shè)為"ABCDABCD"
let arr = ["A", "B", "C", "D", "A", "B", "C", "D"];
console.log("步驟1:拿出4張牌,對折撕成8張,按順序疊放。");
console.log("此時序列為:" + arr.join('') + "\n---");

// 步驟2(無關(guān)步驟):名字長度隨機(jī)選取,這里取2到5(其實任意整數(shù)都行)
const nameLen = Math.floor(Math.random() * 4) + 2;
// 把nameLen張牌移動到序列末尾
arr = moveCardBack(nameLen, arr);
console.log(`步驟2:隨機(jī)選取名字長度為${nameLen},把第1張牌放到末尾,操作${nameLen}次。`);
console.log(`此時序列為:${arr.join('')}\n---`);

// 步驟3(關(guān)鍵步驟):把牌堆頂三張放到中間任意位置
arr = moveCardMiddleRandom(3, arr);
console.log(`步驟3:把牌堆頂3張放到中間的隨機(jī)位置。`);
console.log(`此時序列為:${arr.join('')}\n---`);

// 步驟4(關(guān)鍵步驟):把最頂上的牌拿走
const restCard = arr.shift();  // 彈出隊頭元素
console.log(`步驟4:把最頂上的牌拿走,放在一邊。`);
console.log(`拿走的牌為:${restCard}`);
console.log(`此時序列為:${arr.join('')}\n---`);

// 步驟5(無關(guān)步驟):根據(jù)南方人/北方人/不確定,把頂上的1/2/3張牌插入到中間任意位置
// 隨機(jī)選擇1、2、3中的任意一個數(shù)字
const moveNum = Math.floor(Math.random() * 3) + 1;
arr = moveCardMiddleRandom(moveNum, arr);
console.log(`步驟5:我${moveNum === 1 ? '是南方人' : moveNum === 2 ? '是北方人' : '不確定自己是哪里人'},\
把${moveNum}張牌插入到中間的隨機(jī)位置。`);
console.log(`此時序列為:${arr.join('')}\n---`);

// 步驟6(關(guān)鍵步驟):根據(jù)性別男或女,移除牌堆頂?shù)?或2張牌
const maleNum = Math.floor(Math.random() * 2) + 1;  // 隨機(jī)選擇1或2
for (let i = 0; i < maleNum; i++) {  // 循環(huán)maleNum次,移除牌堆頂?shù)呐?
    arr.shift();
}
console.log(`步驟6:我是${maleNum === 1 ? '男' : '女'}生,移除牌堆頂?shù)?{maleNum}張牌。`);
console.log(`此時序列為:${arr.join('')}\n---`);

// 步驟7(關(guān)鍵步驟):把頂部的牌移動到末尾,執(zhí)行7次
arr = moveCardBack(7, arr);
console.log(`步驟7:把頂部的牌移動到末尾,執(zhí)行7次`);
console.log(`此時序列為:${arr.join('')}\n---`);

// 步驟8(關(guān)鍵步驟):執(zhí)行約瑟夫環(huán)過程。把牌堆頂一張牌放到末尾,再移除一張牌,直到只剩下一張牌。
console.log(`步驟8:把牌堆頂一張牌放到末尾,再移除一張牌,直到只剩下一張牌。`);
while (arr.length > 1) {
    const luck = arr.shift();  // 好運留下來
    arr.push(luck);
    console.log(`好運留下來:${luck}\t\t此時序列為:${arr.join('')}`);
    const sadness = arr.shift();  // 煩惱都丟掉
    console.log(`煩惱都丟掉:${sadness}\t\t此時序列為:${arr.join('')}`);
}
console.log(`---\n最終結(jié)果:剩下的牌為${arr[0]},步驟4中留下來的牌也是${restCard}`);

這段代碼實現(xiàn)了昨晚春晚上劉謙的第二個魔術(shù)表演的過程,并提供了詳細(xì)的解釋。享受魔術(shù)的魅力吧!

以上就是JavaScript代碼實現(xiàn)春晚劉謙魔術(shù)的模擬程序的詳細(xì)內(nèi)容,更多關(guān)于JavaScript劉謙魔術(shù)模擬程序的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • JavaScript實現(xiàn)輸入框與清空按鈕聯(lián)動效果

    JavaScript實現(xiàn)輸入框與清空按鈕聯(lián)動效果

    本文給大家分享基于js實現(xiàn)輸入框與清空框按鈕聯(lián)動效果,非常實用,代碼簡單易懂,感興趣的朋友一起看看吧
    2016-09-09
  • js 用CreateElement動態(tài)創(chuàng)建標(biāo)簽示例

    js 用CreateElement動態(tài)創(chuàng)建標(biāo)簽示例

    用CreateElement動態(tài)創(chuàng)建標(biāo)簽,主要是html中常用的一些標(biāo)簽,在本文有詳細(xì)的示例,喜歡的朋友可以參考下
    2013-11-11
  • jsPDF導(dǎo)出PDF寬大于高異常處理

    jsPDF導(dǎo)出PDF寬大于高異常處理

    這篇文章主要為大家介紹了jsPDF導(dǎo)出PDF寬大于高異常處理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • 通過jQuery學(xué)習(xí)js類型判斷的技巧

    通過jQuery學(xué)習(xí)js類型判斷的技巧

    這篇文章主要介紹了通過jQuery學(xué)習(xí)js類型判斷的技巧,下面和小編一起來學(xué)習(xí)一下吧
    2019-05-05
  • 微信小程序自定義彈出層效果

    微信小程序自定義彈出層效果

    這篇文章主要為大家詳細(xì)介紹了微信小程序自定義彈出層效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • DOM 事件的深入淺出(二)

    DOM 事件的深入淺出(二)

    本文主要講解了DOM事件中Event對象的常用屬性和方法,同時也介紹了其在IE中的兼容性問題及解決方案。希望對大家有所幫助
    2016-12-12
  • 純js+css實現(xiàn)在線時鐘

    純js+css實現(xiàn)在線時鐘

    這篇文章主要為大家詳細(xì)介紹了純js+css實現(xiàn)在線時鐘,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • js CSS操作方法集合

    js CSS操作方法集合

    用js實現(xiàn)的對css的一些操作方法,集合,方便需要用js控制css的朋友
    2008-10-10
  • threejs太陽光與陰影效果實例代碼

    threejs太陽光與陰影效果實例代碼

    在Threejs中類似于我們現(xiàn)實世界,物體顯示的顏色是由物體本身的顏色及光照的顏色相互疊加而得到的,這篇文章主要給大家介紹了關(guān)于threejs太陽光與陰影效果的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • 前端實現(xiàn)代碼質(zhì)量校驗的常用方法與避坑指南

    前端實現(xiàn)代碼質(zhì)量校驗的常用方法與避坑指南

    這篇文章主要為大家詳細(xì)介紹了前端HTML5代碼的質(zhì)量校驗方法,文中的示例代碼講解詳細(xì),希望可以幫助大家規(guī)劃HTML5+AI的學(xué)習(xí)與職業(yè)路徑
    2026-04-04

最新評論

施秉县| 灵宝市| 凯里市| 五原县| 东阿县| 于田县| 绩溪县| 青州市| 宜城市| 陆丰市| 泰兴市| 中阳县| 蓬安县| 台南市| 临夏市| 定日县| 马尔康县| 刚察县| 自贡市| 酉阳| 博客| 阳山县| 宁化县| 来宾市| 林甸县| 天全县| 独山县| 禄劝| 土默特左旗| 泸州市| 吴忠市| 磐石市| 宜宾县| 固安县| 沧源| 崇信县| 调兵山市| 宝山区| 永登县| 苍山县| 合肥市|