2013-04-06 3 views
0

일부 알고리즘을 사용하여 놀고 있었는데 예상치 못한 결과가 나타났습니다. 여기에 내 코드 :재귀 함수는 결과에 중복을 생성합니다.

traverse = (tree, stack) -> 
    stack.push tree.node 
    if not tree.branches 
    stack 
    else 
    traverse branch, stack for branch in tree.branches 

one = { node: 1 } 
two = { node: 2 } 
tree = { node: "+", branches: [one, two] } 

console.log traverse one, [] # => [ 1 ] 
console.log traverse two, [] # => [ 2 ] 
console.log traverse tree, [] # => [ [ '+', 1, 2 ], [ '+', 1, 2 ] ] 

내가 tree을 통과하는 동안 얻을 것으로 예상 출력은 [ '+', 1, 2 ]하지만이 중복됩니다. 나는 여기서 간단한 것을 놓치니?

감사합니다.

답변

1

함수에 명시적인 return이없는 경우 반환 값은 마지막 표현식의 값입니다. 함수의 마지막 표현은 이것이다 :

if not tree.branches 
    stack 
else 
    traverse branch, stack for branch in tree.branches 

if들과 for의 모두 커피 스크립트에서 표현됩니다.

그럼 if의 값은 무엇이며 따라서 함수의 값은 무엇입니까? tree.branches이 있으면 stack이되고, 그렇지 않으면 for 값이 표시됩니다. 의 ... 최종 배열이 모든 stack을 어디에 배열의 배열의 배열 : tree.branches이있는 경우

a = (i for i in [0 .. 6]) 
# a is now [0, 1, 2, 3, 4, 5, 6] 

그래서, 당신은 무엇을 transverse 반환의 배열을 반환까지 종료 : 커피 스크립트 for 루프는 배열로 평가 .

당신은 단지 좀 더 명시 적으로 귀하의 반환 값에 대해 할 필요가

,이 같은 트릭을 수행해야합니다

traverse = (tree, stack) -> 
    stack.push tree.node 
    if tree.branches 
    traverse branch, stack for branch in tree.branches 
    stack # <------------ Now we always return stack 

데모 : http://jsfiddle.net/ambiguous/2QJ9e/

+0

아! 당신은 정말로 옳습니다. for 루프는 배열 (바깥 쪽 [])을 반환하고 스택은 변경 가능합니다. 따라서 처음으로 스택을 반환해도 [+ 1], 두 번째 값은 [+ 1 2]로 변경됩니다. 감사. – j1n3l0

관련 문제