簡體   English   中英

JS中的遞歸函數問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM