2013-04-06 72 views
0

我正在玩coffescript中的一些算法,並以一些意想不到的輸出結束。這裏是我的代碼:遞歸函數在結果中生成重複項

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 S和for s爲在CoffeeScript的表達式。

那麼if的值是多少,因此函數的值是多少?如果tree.branches在那裏,那麼你得到stack,否則你得到for的值。一個CoffeeScript的for循環計算到一個數組:

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

所以,如果tree.branches是存在的,你最終會回到什麼transverse返回數組:...的當最終陣列都stack數組的數組的數組。

你只需要一點更加明確的返回值,這樣的事情應該做的伎倆:

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 2013-04-06 18:18:48