我目前正在盡可能多地學習遞回的知識,但我真的被卡在了如何使用遞回來檢查一個陣列中的所有數字元素是否為偶數上。在ES6中,我可以使用 "every "來達到預期的結果,如下所示:
const isEven = (arr) => arr。 every((item) => item % 2 ==0)。)
console. log(isEven([2, 4,6,8] )。// true>
console. log(isEven([2, 4,6,9] )。// false
下面是我作為遞回的嘗試:
const isEven=(arr)=> (arr. length ==0) ? true : isEven(arr. slice(1)) % 2 ==0;
console. log(isEven([2, 4,6,8] )。// true>
console. log(isEven([2, 4,6,9] )。// true
正如你所看到的,第二個例子的結果是不正確的,我感覺我也沒有走對路。誰能告訴我我做錯了什么?
uj5u.com熱心網友回復:
你的實作的問題是,isEven回傳一個boolean,但你試圖將結果當作一個數字來使用。
console. log("true % 2 ==0 :", true % 2 ==0) 。
console. log("false % 2 ==0:", false % 2 ==0) 。
const isEven = (arr) => (arr.length ==0) ? true : isEven(arr. slice(1)) % 2 ==0;
console.log(isEven([])); // true.
console.log(isEven([1]);// false.
console。 log(isEven([1, 1]); // true
<iframe name="sif1" sandbox="allow-forms allow-modals allow-scripts" class="snippet-box-edit snippet-box-result" frameborder="0"></iframe>
如果我們把你的函式完全寫出來,而不是作為一個單一的條件運算子,我們可以通過添加一些日志來更好地看到發生了什么:
。const isEven = (arr) => {
if (arr.length == 0) {
console.log("base case - finish recursion. result: true"/span>)。
return true。
}
const recursionValue = isEven(arr.slice(1)。
const result = recursionValue % 2 === 0;
console.log(`After recursion:
recursionValue。${recursionValue}。
結果: ${result}`)。)
return result。
}
console. log(isEven([2, 4,6,9] )。// true
.as-console-wrapper { max-height: 100% ! important; }
<iframe name="sif2" sandbox="allow-forms allow-modals allow-scripts" class="snippet-box-edit snippet-box-result" frameborder="0"></iframe>
或者以不同的方式來說明這個問題,這就是遞回的解決方式:
isEven([2,4,6,9])
|--> | isEven([4,6,9]) % 2 ==0
| --> | isEven([6,9]) % 2 ==0
| | --> | isEven([9]) % 2 === 0
| | | --> isEven([]) % 2 === 0
| | | --> arr.length ==0 --> true
| | | | true % 2 === 0 --> false
| | | | false % 2 === 0 --> true
| | true % 2 === 0 --> false
| | 假的 % 2 === 0 --> 真的
|真
為了達到你的目的,你需要每次檢查第一個元素,而不是isEven的結果。
- 如果陣列是空的,那么整個陣列必須是偶數。這就是基本情況。遞回結束,結果是
true。
- 如果第一個元素是奇數,那么不是所有的陣列都是偶數。這是一個終端條件。結束遞回并回傳
false- 這意味著不會達到基本情況。 - 如果陣列中有are項,并且第一項是偶數,只需通過使用陣列的其余部分來遞回,每次都檢查上述兩個條件。
這樣可以確保你在從未達到第二個條件時得到true,或者在達到第二個條件時得到false。
const isEven = (arr) => {
if (arr.length == 0) //空--基本情況。
return true;
if (arr[0] % 2 == 1) //odd - 停止并回傳false。
return false。
return isEven(arr.slice(1)); //遞推
}
console. log(isEven([2, 4,6,8] )。// true>
console. log(isEven([2, 4,6,9] )。// false
<iframe name="sif3" sandbox="allow-forms allow-modals allow-scripts" class="snippet-box-edit snippet-box-result" frameborder="0"></iframe>
uj5u.com熱心網友回復:
問題出在isEven(arr.slice(1)) % 2 ==0部分。isEven函式應該回傳一個布林值,對于這個布林值來說,取模是沒有意義的。
相反,你可以這樣做:
isEven = arr => arr.length ==0 ? true : arr[0] % 2 === 0 && isEven(arr. slice(1) )。
uj5u.com熱心網友回復:
前提應該是:
如果第一個元素是偶數,并且陣列的其他部分(也是一個陣列)也是偶數,那么這個陣列就是偶數
。所以基本上:
const isEven=(arr)=> (arr. length ==0) ? true : arr[0] % 2 === 0 && isEven(ar. slice(1) )。
為了更好地示范,可以用結構化的方式重寫一下。
const isEven = ([first, ...rest]/span>) =>
(first % 2 === 0) & &
(rest.length ? isEven(rest) : true)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/319299.html
標籤:
