有一個任務:有一些男孩想打架,如果人數是雙數,他們就分成兩組,誰輸了就回家。他們分成兩組,打架,有人回家,直到他們得到奇數的人。最后剩下奇數人時,每個人都與所有可能的敵人戰斗。公式看起來像:n(n-1)/2。例如,5個人--10場戰斗。
如果從一開始的人數就是奇數--同樣的計算方法:n(n-1)/2。
我寫了一個腳本,可以計算所有可能的戰斗次數,就像這樣:
。function qwe(number) {
if(number % 2) {
return number = number*(number-1)/ 2
} else {
number = number / 2;
return number qwe(number)
}
}
console.log(qwe(6) ;
<iframe name="sif1" sandbox="allow-forms allow-modals allow-scripts" class="snippet-box-edit snippet-box-result" frameborder="0"></iframe>
但是,如果我知道戰斗的數量,并想知道我需要多少人參加這個戰斗,該怎么辦? 如何以相反的方式執行這一功能?
uj5u.com熱心網友回復:
你不能輕易地扭轉這個函式,至少不能完全扭轉。
如果有三個戰士,將會有3 * (3 - 1) / 2,或3場戰斗。 如果是四名拳手,第一輪將有2場比賽,然后在第二輪有1場比賽,即3場比賽。 因此,如果我們知道有三場比賽,我們不知道是有三個還是四個戰士。 同樣,qwe (10)是15,qwe (16)也是。
這是有可能的--事實上,從我的測驗來看,似乎很有可能(在n為1000000時),最多只有兩個輸入可以產生任何給定的輸出。
我們可以通過窮舉法找到它們,因為很容易證明qwe (n)總是至少n - 1,所以如果我們檢查所有比目標值多一個的答案,我們將找到所有擊中目標的答案。 但對于這樣一個混亂的函式,我很難看出如何改進這種詳盡的搜索。 我們可以很容易地測驗奇數結果,因為qwe (n) = n * (n - 1) / 2,通過一些簡單的代數,我們可以證明,如果qwe (n) == t,然后n = (1 sqrt (1 8 * t)) / 2,但測驗遞回步驟似乎更有問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/319327.html
標籤:
上一篇:不能在類內使用一個方法
下一篇:每次有太多的遞回
