递归函数在结果中生成重复项

时间:2013-04-06 16:57:32

标签: algorithm recursion coffeescript

我正在使用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 个答案:

答案 0 :(得分:1)

如果函数没有显式return,则返回值是最后一个表达式的值。函数中的最后一个表达式是:

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

请注意,iffor都是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/