摘要:解題思路就是選擇兩個數(shù)字,一個最小值和一個最大值,取這兩者的平均值作為判斷。判斷的數(shù)字小了,就減小最大值。用遞歸使取值的范圍逐漸縮小。當(dāng)取值等于目標(biāo)值的時候,打印這個值,并結(jié)束遞歸。
解題思路就是選擇兩個數(shù)字,一個最小值和一個最大值,取這兩者的平均值作為判斷。
判斷的數(shù)字大了,就增大最小值。
判斷的數(shù)字小了,就減小最大值。
用遞歸使取值的范圍逐漸縮小。
當(dāng)取值等于目標(biāo)值的時候,打印這個值,并結(jié)束遞歸。
這里遇到了一個問題,比如當(dāng)用戶輸入了一個數(shù)字1,代碼中的number會變得足夠小,取值范圍最后會有 1-4 和 1-3,這兩個范圍的平均值向下取整后,都為2,最后發(fā)現(xiàn)會重復(fù)打印兩個數(shù)字2。
所以我加入了一個數(shù)組,將猜過的數(shù)字放入數(shù)組中,如果當(dāng)前猜的數(shù)字已存在數(shù)組中,就再用一個stamp做判斷,看上一次是猜大了還是猜小了,猜小了就加一,猜大了就減一。
// 初始值 var number = 100 // 猜數(shù)次數(shù) var time = 0 // 每次猜的數(shù)字 var temp = null // 標(biāo)記上一次是猜大了還是猜小了 var stamp = null // 存放猜過的數(shù)字 var array = [] function guess (target, min = 1, max = 100) { // 判斷給的數(shù)字是否在范圍內(nèi) if (target > 100 || target < 1) { console.log("要1到100的數(shù)字哦!") return } temp = Math.floor((max + min) / 2) temp = tempChange(temp) // 將猜過的數(shù)字放進(jìn)一個數(shù)組里 array.push(temp) number = Math.floor(number / 2) if (number === 0) number = 1 if (target === temp) { console.log("第" + ++time + "次,我猜是" + temp + "%c bingo!", "color: green") return } else if (target >= min + number) { console.log("第" + ++time + "次,我猜是" + temp + "%c 小了!", "color: red") // 猜小了,標(biāo)記為true stamp = true guess(target, min + number, max) } else if (target <= max - number) { console.log("第" + ++time + "次,我猜是" + temp + "%c 大了!", "color: red") // 猜大了,標(biāo)記為false stamp = false guess(target, min, max - number) } } // 判斷這個數(shù)字是否已經(jīng)猜過 function tempChange (temp) { if (array.indexOf(temp) !== -1) { if (stamp) { temp++ } else { temp-- } } return temp } guess(9)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/99952.html