2017-04-25 1 views
1

재귀 함수를 사용하여 Javascript의 reduce를 재정의하려고 시도하고 있습니다. 내 시도가 있는데 작동하지 않습니다. 누구나 그것을 약간만 변경하여 효과를 낼 수 있다면, 나는 그것을 더 잘 이해할 것이므로 좋을 것입니다. (이것은 functional-javascript-workshop의 연습 문제입니다).축소 작업 (JS)의 재귀 적 정의가 아닌 이유는 무엇입니까?

/usr/local/lib/node_modules/functional-javascript-workshop/exercises/basic_recursion/exercise.js:13 
    prev[curr] = ++prev[curr] || 1 
          ^

TypeError: Cannot create property 'undefined' on string 'exercitation' 
    at /usr/local/lib/node_modules/functional-javascript-workshop/exercises/basic_recursion/exercise.js:13:29 
    at reduce (/home/david/node-school/functional-workshop/solution.js:7:28) 
    at /usr/local/lib/node_modules/functional-javascript-workshop/exercises/basic_recursion/exercise.js:12:10 
    at obtainResult (/usr/local/lib/node_modules/functional-javascript-workshop/exercises/runner.js:100:21) 
    at Exercise.<anonymous> (/usr/local/lib/node_modules/functional-javascript-workshop/exercises/runner.js:66:27) 
    at next (/usr/local/lib/node_modules/functional-javascript-workshop/node_modules/workshopper-exercise/exercise.js:188:19) 
    at /usr/local/lib/node_modules/functional-javascript-workshop/node_modules/workshopper-exercise/exercise.js:195:7 
    at Exercise.<anonymous> (/usr/local/lib/node_modules/functional-javascript-workshop/exercises/runner.js:34:5) 
    at next (/usr/local/lib/node_modules/functional-javascript-workshop/node_modules/workshopper-exercise/exercise.js:188:19) 
    at /usr/local/lib/node_modules/functional-javascript-workshop/node_modules/workshopper-exercise/exercise.js:195:7 
+0

그냥 궁금해 :'if (arr.length)'작동합니까? 나는 항상'if (arr.length> 0)'를 사용한다 ... ... – Danmoreng

+2

당신은 우리에게 정확한 코드를 보여주지 않는다. 오류는'line.lib.js'에서 호출 한 후'exercise.js'에서 발생합니다. –

+1

@ Danmoreng, truey 값을 검사합니다. –

답변

6

당신은 누적 업데이트해야합니다 :

function reduce(arr, fn, acc) { 
 
    if (arr.length) { 
 
    var newArr = arr.slice(1, arr.length); 
 
    acc = fn(arr[0], acc) 
 
    return reduce(newArr, fn, acc); 
 
    } else { 
 
    return acc; 
 
    } 
 
} 
 

 
console.log(reduce([1,2,3], (val, sum) => sum + val, 0))

를 그것은 나에게 내가 해석하는 방법을 모르는 다음 암호 같은 오류 메시지를 제공

function reduce(arr, fn, initial) { 
    if (arr.length) { 
    var newArr = arr.slice(1, arr.length); 
    return reduce(newArr, fn, fn(arr[0])); 
    } else { 
    return initial; 
    } 
} 

module.exports = reduce 

+2

여러분의 의견은 똑같습니다. (고마워!) –

+1

젠체하는 사람 – thedude

+0

나는 당신을 단지 El Duderino – Greeso

2

당신은 acc의 현재 값을 전달하는 것을 잊었습니다. (예 : initial)을 fn 호출로 입력하십시오.

0

다른 사람들이 언급했듯이 누적기를 fn으로 전달하지 못했습니다. 호기심이 있다면 reduce은 단일 삼항 (?:) 표현식으로 표현할 수 있습니다. arr.slice(1)1에서 배열의 끝까지 슬라이스됩니다. arr.length === 0, arr.slice(1)arr[1]가 배열을 다루는 기능 코드에서 너무 일반적이다

const reduce = (arr, fn, acc) => 
 
    arr.length === 0 
 
    ? acc 
 
    : reduce(arr.slice(1), fn, fn(acc, arr[0])) 
 

 
const add = (x,y) => x + y 
 

 
console.log(reduce([1,2,3], add, 0)) // 6

때문에이 경우에는 조각의 끝을 지정할 필요가 없습니다, 이러한 함수로 추상화 참조하는 것이 일반적이다 복잡성과인지 부하를 줄이기 위해

// isEmpty :: [a] -> Boolean 
 
const isEmpty = arr => arr.length === 0 
 

 
// head :: [a] -> a 
 
const head = arr => arr[0] 
 

 
// tail :: [a] -> [a] 
 
const tail = arr => arr.slice(1) 
 

 
// reduce :: ([a], ((b, a) -> b), b) -> b 
 
const reduce = (arr, fn, acc) => 
 
    isEmpty(arr) 
 
    ? acc 
 
    : reduce(tail(arr), fn, fn(acc, head(arr))) 
 

 
// add :: (Number, Number) -> Number 
 
const add = (x,y) => x + y 
 

 
console.log(reduce([1,2,3], add, 0)) // 6

관련 문제