我知道 return 陳述句有問題,但我不知道是什么問題。
let arr = ['a', 'b', 'c', 'a']
let size = arr.length - 1
let counter = 0
function findOcc(arr, size, x) {
if (size === 0) {
return counter
} else {
if (arr[size] === x) return counter
findOcc(arr, size - 1, 'a')
}
}
console.log(findOcc(arr, size, "a"))
uj5u.com熱心網友回復:
看來你的邏輯是正確的,但沒有很好地實作它。
因此,對于您所說的基本條件,
if (size===0)回傳計數器。這意味著您只是回傳計數器,但arr[0]它是有效的支票。因此,當您檢查元素時,您真正想要的是arr[size-1]在下一行,即 else對于 else 條件,您打算增加正確的計數器,但您不應該回傳。相反,您使用 size-1 回傳下一個呼叫的值
您的尺寸宣告也應該是
let size = arr.length最后一個引數也應該在遞回呼叫中
x而不是a在遞回呼叫中。
這樣,代碼是:
let arr = ['a', 'b', 'c', 'a']
let size = arr.length
let counter = 0
function findOcc(arr,size,x) {
if (size === 0) return counter
if(arr[size-1]===x) counter
return findOcc(arr,size-1,x)
}
console.log(findOcc(arr, size, "a"))
uj5u.com熱心網友回復:
一個更簡單的遞回版本使用陣列解構來根據目標值測驗第一個值,如果匹配則添加一個,如果不匹配則添加零,然后在陣列的其余部分上回圈。當值未定義時我們停止,這意味著我們已經用完了陣列中的元素。
const countOcc = (target) => ([x, ...xs]) =>
x == undefined ? 0 : (x == target ? 1 : 0) countOcc (target) (xs)
const arr = ['a', 'b', 'c', 'a']
console .log (countOcc ('a') (arr))
console .log (countOcc ('b') (arr))
console .log (countOcc ('c') (arr))
console .log (countOcc ('d') (arr))
雖然我們可以改變它以使其成為尾遞回,但當前的 JS 引擎仍然不進行尾呼叫優化,所以看起來有點毫無意義。如果您要在大型陣列上執行此操作,您可能需要用迭代代替遞回進行重寫。
uj5u.com熱心網友回復:
如果可以改變原始陣列,那么函式可以簡化如下:
const origArr = ['a', 'b', 'c', 'a'];
// a simpler implementation of the same recursive function
function findOcc(arr, x) {
return (
arr.length // if "arr" length is 1 or more
? arr.pop() === x // ".pop()" the last elt & compare with "x"
? 1 findOcc(arr, x) // add 1 & recurse using the shorted/mutated "arr"
: findOcc(arr, x) // do not add 1, but recurse using the mutate "arr"
: 0 // no more elements in "arr", so return 0
)
}
// using "..." spread to avoid "arr" from being changed
console.log('number of times "a" occurs is: ', findOcc([...origArr], "a"))
console.log(
`"d" occurs in ["${origArr.join('", "')}"] ${findOcc([...origArr], "d")} times...`
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/466268.html
標籤:javascript 数组 算法 递归
上一篇:在嵌套陣列jq中抓取n項
