快速的解決方案:
function findNextSquare(sq) {
var rt = Math.sqrt(sq);
return rt % 1 !== 0 ? -1 : (rt + 1)**2;
}
說明:
這有什麼做不同步。
rt++
在console.log((rt++)**2)
使rt
變量爲遞增。因此,當rt
到達return
行時,將會有所不同(比應該多一個)。
注意區別:
rt + 1
是,增加了1至rt
並返回結果— rt
保持不變
rt++
加1 rt
,並將結果保存回rt
的表達,返回舊rt
++rt
加1 rt
,並將結果保存回rt
,並返回新rt
讓我們看看你的原始代碼做了與sq = 16
,與console.log
不註釋掉:
function findNextSquare(sq) { // sq = 16
var rt = Math.sqrt(sq); // rt = 4
console.log((rt++) ** 2); // logs 4^2 = 16, rt incremented to 5
return rt % 1 !== 0 ? -1 : (rt++)**2; // returns 5^2 = 25, rt incremented to 6 (unneeded)
}
當你刪除console.log
,這是結果:
function findNextSquare(sq) { // sq = 16
var rt = Math.sqrt(sq); // rt = 4
return rt % 1 !== 0 ? -1 : (rt++)**2; // returns 4^2 = 16, THEN rt is incremented to 5
}
解決方案是將1添加到rt
然後正方形的新值。我們實際上並不需要保存回新值rt
:
function findNextSquare(sq) { // sq = 16
var rt = Math.sqrt(sq); // rt = 4
return rt % 1 !== 0 ? -1 : (rt + 1)**2; // returns (4 + 1)^2 = 25
}
如果你想在那裏console.log
,你可以擁有它,只要確保它不會改變rt
:
function findNextSquare(sq) {
var rt = Math.sqrt(sq);
console.log((rt + 1) ** 2);
return rt % 1 !== 0 ? -1 : (rt + 1) ** 2;
}
因爲你通過執行'rt ++'來增加控制檯日誌中的'rt'值, –