[英]Recursive function issue in JS
所以我需要使用遞歸來解決這個問題STRICTLY
// 2. Compute the sum of an array of integers. // sum([1,2,3,4,5,6]); // 21
然后我在PythonLive中測試這個解決方案
var sum = function(array) { if(array.length===0){ return array } return array.slice(0,array.length)+sum(array.pop()) }; sum([1,2,3,4,5,6]);
然后在第6步它說“TypeError:array.slice不是一個函數”
我不明白為什么如果它已經工作從數組中取出6並返回剩余的數組...
有人可以解釋一下我做錯了嗎?
謝謝! :)
如果查看返回值,您將看到始終返回一個數組。 當你想要一個數字作為最終結果時,這是不對的。 當array.length === 0
你可以安全地返回0,因為它與空數組相同。 這是你的邊緣條件。 之后你只需要一個元素和其余元素的總和。
你也可以在它為零時返回數組長度,以獲得非常簡潔的解決方案。 &&
shortcircuits返回左側元素,如果它是假的(如0),否則第二個:
var sum = (array) => array.length && array.pop() + sum(array) console.log(sum([1,2,3,4,5,6]));
如果您更喜歡slice
您也可以這樣,這基本上是相同的:
var sum = (array) => array.length && array[0] + sum(array.slice(1)) console.log(sum([1, 2, 3, 4, 5, 6]));
您的代碼的問題在於您正在以錯誤的方式處理值,它應該是
return sum(array.slice(0,array.length-1)) + array.pop();
事實上,因為array.pop()
刪除了元素,你可以這樣做:
return array.pop() + sum(array);
當array.length===0
,您還需要返回0
,否則總和將失敗。
if (array.length===0) return 0;
然而,通過reduce
這樣做更簡單:
let arr = [1,2,3,4,5,6]; console.log(arr.reduce((t, v) => { return t + v; }, 0));
遞歸和函數:
const sum = list => {
if (!list.length) return 0;
return list.pop() + sum(list);
};
因為.pop
改變數組,所以不需要使用切片。 對於非破壞性版本(不會更改原始數組):
const sum = ([first, ...rest]) => {
if (first === undefined) return 0;
return first + sum(rest);
};
使用顯式empty
和純表達式的另一種編碼
const empty = x => x === empty const sum = ([ x = empty, ...rest ]) => empty (x) ? 0 : x + sum (rest) console.log ( sum ([ 1, 2, 3, 4, 5 ]) // 15 , sum ([]) // 0 )
你問的如何對嵌套數組求和的另一個問題被擱置了,原因我不明白。 您可以調整上述實現以支持嵌套數組的輸入
const empty = x => x === empty const sum = ([ x = empty, ...rest ]) => empty (x) ? 0 : Array.isArray (x) ? sum (x) + sum (rest) : x + sum (rest) console.log ( sum ([ 1, [ 2, [ 3, 4 ], 5 ]]) // 15 , sum ([ 1, 2, 3, 4, 5 ]) // 15 , sum ([[[]]]) // 0 , sum ([]) // 0 )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.