递归的JavaScript值不会回来

时间:2016-02-16 04:06:55

标签: javascript recursion coffeescript

我正在尝试编写一个调度应用程序,它接收课程信息并创建所有可能的日程安排。我之前从未在javascript中编写过递归函数,但我不确定为什么它会与其他语言不同。

在递归方法中,值似乎正确地添加到数组中,但是一旦执行返回到非递归函数,则值显然会丢失。

以下是有问题的功能(用咖啡脚本编写),here是我当前功能的小提琴。

有人可以告诉我为什么schedules中返回的两个数组都是空的吗?

combine: ->
    schedules = []
    @recursiveCombine(@courses, [], schedules)
    return schedules

recursiveCombine: (courses, chosenSections, schedules) ->
    if chosenSections.length is Object.keys(courses).length
        console.log 'pushing schedule: '
        for section in chosenSections
            console.log '\t' + section.courseName + ' ' + section.number

        schedules.push chosenSections
        return

    next = chosenSections.length
    course = courses[next]
    for section in course.sections
        if not @overlap(section, chosenSections)
            chosenSections.push section
            @recursiveCombine(courses, chosenSections, schedules)
            chosenSections.pop()

1 个答案:

答案 0 :(得分:1)

此:

schedules.push chosenSections

通过引用将数组chosenSections 添加到最终数组中。当您稍后使用chosenSections.pop()修改此数组时,您希望schedules中的内容有效地“消失”。您需要将chosenSections数组复制到schedules。根据你的其余代码判断,你可能只是想把它弄平:

if chosenSections.length is Object.keys(courses).length
    console.log 'pushing schedule: '
    for section in chosenSections
        console.log '\t' + section.courseName + ' ' + section.number

        #here we are copying a reference to each item inside chosenSections
        schedules.push section
    return

更多CoffeeScript-y方法是使用splat operator (...)。删除日志记录,它看起来像这样:

if chosenSections.length is Object.keys(courses).length
    schedules.push chosenSections...
    return