Javascript 基于决策树形式的递归

Javascript 基于决策树形式的递归,javascript,recursion,Javascript,Recursion,我一直在做一个基于决策树的表单。表格由四个问题组成,每个问题都有预先确定的答案。每一页可以有一个问题分支到一个新的问题分支。当用户回答将页面发送到新分支机构的问题时,页面以div的形式显示,其中包含分支机构名称和页码(data branch=“where”和data page number=“1”)的数据属性,设置一个nextBranch变量,在回答了所有四个问题后,将分支名称和页码值添加到日志中,并调用next()方法。此方法根据nextBranch变量和日志中的最后一项(分支名称和页码)计算

我一直在做一个基于决策树的表单。表格由四个问题组成,每个问题都有预先确定的答案。每一页可以有一个问题分支到一个新的问题分支。当用户回答将页面发送到新分支机构的问题时,页面以div的形式显示,其中包含分支机构名称和页码(data branch=“where”和data page number=“1”)的数据属性,设置一个nextBranch变量,在回答了所有四个问题后,将分支名称和页码值添加到日志中,并调用next()方法。此方法根据nextBranch变量和日志中的最后一项(分支名称和页码)计算出下一页

如果nextBranch不等于currentBranch,则会将用户带到nextBranch的第一页,但如果nextBranch等于currentBranch,则会增加页码,并将用户带到当前分支的下一页。如果没有找到结果,我将调用一个方法,该方法将反向遍历页面日志,直到迭代中的分支值与currentBranch值不同。当这些值不匹配时,我从当前迭代中增加页码并查找该页面

当我从原始分支分支出来时,这种方法可以很好地工作,但是当我从一个分支分支分支出来时,反向循环日志不再工作

假设我有下面的树结构,我从A1开始,回答引导我到C2的问题,我的日志如下所示:

[{'A': '1'},{'A': '2'},{'A': '3'},{'B': '1'},{'B': '2'},{'C': '1'},{'C': '2'}]
当到达C2时,由于不是C3,我反向循环通过日志,到达的第一个分支名称不等于最后一个条目的条目是B2,因此增加页码返回B3,这是有效的。现在日志看起来像这样

[{'A': '1'},{'A': '2'},{'A': '3'},{'B': '1'},{'B': '2'},{'C': '1'},{'C': '2'},{'B: '3'}]
在完成B3 I循环后,再次反向登录,我到达的第一个分支名称不等于最后一个条目的条目是C2-递增此处的页面返回C3,而实际上它应该返回A4

我正在努力找到一个解决方案与目前的方式,这是设置,所以我会喜欢任何建议

这是我目前拥有的一把小提琴-


我假设日志需要保留所有的页面视图,因此可能不需要搜索日志


相反,您可以专门为此反向搜索创建一个堆栈。每当分支ID发生更改时,都会将旧ID推送到堆栈上。当C页面用完时,查看堆栈,发现B是上一个,因此弹出B并继续下一个B页面。当B页用完时,堆栈顶部将是A,您可以按预期移动。

我认为日志需要保留所有页面视图,因此可能不需要搜索日志


相反,您可以专门为此反向搜索创建一个堆栈。每当分支ID发生更改时,都会将旧ID推送到堆栈上。当C页面用完时,查看堆栈,发现B是上一个,因此弹出B并继续下一个B页面。当B页用完时,堆栈顶部将是A,您可以按预期移动。

有时您只需要第二双眼睛。记录(在本例中)A3、B2和C2,然后在当前分支中没有更多页面时弹出堆栈是非常有意义的。有时,您只需要第二对眼睛。记录(在本例中)A3、B2和C2,然后在当前分支中没有更多页面时弹出堆栈,这非常有意义。