2017-12-31 35 views
0

대수 계산기를 작성 중이며 다항식에서 조건을 필터링하는 재귀 함수를 사용하고 있습니다. 아래 함수는 비슷한 용어의 배열을 원하는 배열로 생성한다는 점에서 작동합니다. 함수에 console.log 문을 추가하여이를 확인할 수 있습니다. 그러나 어떤 이유로 인해 함수는 출력을 반환하지 않습니다. "undefined"를 반환합니다.arguments 속성을 사용하는 재귀 Javascript 함수는 정답을 제공하지만 정의되지 않은 값을 반환합니다.

제 생각에 재귀 호출 체인이 아래에 표시된 끝 조건으로 종료되어야하고 스택을 통해 반환 된 인수 [1] 배열을 전달해야합니다.

본인은 하나 이상의 장소에 신고서를 제출하는 것을 잊어 버린 곳에서 비슷한 질문을 읽었습니다. 그러나, 내 코드에서 최종 조건 및 재귀 함수 호출 반환 문이 있습니다. 그것은 아마도 내가 누락 된 단순한 무언가 일 것입니다.

var filterLikeTerms = function (terms) { //takes an array of terms, optional second argument is an array of arrays of similar terms 
 
    if (!arguments[1]) arguments[1] = []; //Initilizes the second argument if none is given 
 
    if (terms.length == 0) return arguments[1]; //End condition 
 
    arguments[1].push(terms.filter(term => terms[0].toString() === term.toString())); //Adds similar terms to the 2nd argument array 
 
    terms = terms.filter (term => terms[0].toString() !== term.toString()); //shortens the terms array to exclude the like terms filtered above 
 
    return filterLikeTerms(terms, arguments[1]); //recursive function call 
 
}

+0

후 무엇을 'filterLikeTerms'를 호출하고 있습니까? 문자열로 전달되어야하는 속성에서'.toString'을 호출합니다. '7x + 1'을 값으로 전달할 수 없습니다. 그것은 이미 문자열 일 것입니다. 두 번째 메모는 코드가 영리 해 지려고하는 것 같습니다. 한 걸음 뒤로 물러나 간단히 걸 으시고 나중에 최적화하십시오. – VtoCorleone

+0

아마도이 질문을 이해할 수 없지만'console.log (filterLikeTerms ([ 'A', 'B', 'C', 'D']))')'라고하면 배열의 배열을 출력하고 정의되지는 않습니다 .. – bigless

+0

'terms' 매개 변수 하나만 받아들이므로'arguments '매개 변수를 메서드에 전달할 수 없습니다. 나는 당신이 2 개의 매개 변수'filterLikeTerms (terms, arguments)'를 받아들이도록 메소드를 만들 필요가 있다고 생각한다. 예제 입력과 예상 출력과 같이 질문의 이해를 돕는 프로세스의 예가 있습니다. – Eaton

답변

0

일 스마트 열심히

불필요한 변수, 할당, 또는 논리적 조건으로 머리를 다치게하지 않으려 고하지 - 간단한 평등 간단한 재귀 함수는

테스트

const eq = x => y => 
 
    x === y 
 

 
const neq = x => y => 
 
    x !== y 
 

 
const filterLikeTerms = ([ x, ...xs ]) => 
 
    x === undefined 
 
    ? [] 
 
    : [ xs.filter (eq (x)) ] 
 
     .concat (filterLikeTerms (xs.filter (neq (x)))) 
 

 
const data = 
 
    ['a', 'b', 'c', 'd', 'a', 'b', 'c', 'd', 'a', 'a', 'b'] 
 

 
console.log (filterLikeTerms (data)) 
 
// [ [ a, a, a ] 
 
// , [ b, b ] 
 
// , [ c ] 
 
// , [ d ] 
 
// ]
당신이 그랬던 것처럼 당신이 누적 매개 변수를 사용합니다

유연한 구현

당신이 항목을 비교 및 ​​그룹화하는 방법을 변경하려면, eq

// for example ... 
const eq = x => y => 
    x.toString() === y.toString() 

const neq = x => y => 
    x.toString() !== y.toString() 

neq을 변경하여 원래 코드는 괜찮습니다.이 형식은 매우 큰 입력에 대해 stack-safe을 쉽게 만들 수 있습니다.

적절한 꼬리 호출 (바로 위) 거대한 데이터 입력 작업을 우리를 제기하지만, 여러 필터 목록의 각 항목에 대한 을 실행하기 때문에 우리의 기능은 매우 비효율적에도 smarterer

작업 할 수 있습니다. 우리는 Map을 활용하여 극적인 개선을 할 수 있습니다 - 지금 우리는 학습을 중단하지 마십시오

const filterLikeTerms = ([ x, ...xs ], acc = new Map) => 
 
    x === undefined 
 
    ? Array.from (acc.values()) 
 
    : acc.has (x) 
 
     ? filterLikeTerms (xs, acc.set (x, [x].concat (acc.get (x)))) 
 
     : filterLikeTerms (xs, acc.set (x, [x])) 
 

 
const data = 
 
    ['a', 'b', 'c', 'd', 'a', 'b', 'c', 'd', 'a', 'a', 'b'] 
 

 
console.log (filterLikeTerms (data))


하면 원래의 입력 의 각 항목을 터치 아직

당신은 모든 종류의 깔끔한 것들을 스스로 만들 수 있습니다.다음은이 대답에 관련된 내가 쓴 몇 가지이다 :

0

뒤에 마법 :

const filterLikeTerms=terms=>[...(new Set(terms))]