我有一个问答流程如下:
基本思想是,根据为问题选择的答案,接下来会问一个不同的问题。
我目前使用以下JavaScript对象表示此问答流程:
var QAndAObj = {
1: {
question: 'Question 1',
answers: [
{
answerText: 'Answer 1-1',
nextQuestion: 2
},
{
answerText: 'Answer 1-2',
nextQuestion: 3
}
]
},
2: {
question: 'Question 2',
answers: [
{
answerText: 'Answer 2-1',
nextQuestion: 3
},
{
answerText: 'Answer 2-2',
nextQuestion: null
}
]
},
3: {
question: 'Question 3',
answers: [
{
answerText: 'Answer 3-1',
nextQuestion: 4
},
{
answerText: 'Answer 3-2',
nextQuestion: null
},
{
answerText: 'Answer 3-3',
nextQuestion: null
}
]
},
4: {
question: 'Question 4',
answers: [
{
answerText: 'Answer 4-1',
nextQuestion: null
},
{
answerText: 'Answer 4-2',
nextQuestion: null
}
]
}
};
为了向用户显示进度条,我希望能够通过问题流计算最长和最短的路径。
我最初的想法是编写一个类似于下面的递归函数来关闭流中的每个可能路径:
function recurse(node) {
for (var i = 0; i < node.answers.length; i++) {
if (node.answers[i].nextQuestion) {
recurse(QAndAObj[node.answers[i].nextQuestion]);
}
}
}
上面的函数允许我命中流中的每个节点,但我不知道如何计算流中最长和最短的路径。
任何帮助/建议/代码将不胜感激。 非常感谢你。
看看这个jsFiddle的工作实例。
function shortAndLong(QATree, startNode) {
var paths = [];
function findAllPaths(startNode, currentCost) {
for (var i = 0; i < startNode.answers.length; i++) {
var child = startNode.answers[i];
if (child.nextQuestion == null) {
paths.push(currentCost);
}else {
findAllPaths(QATree[child.nextQuestion], currentCost+1);
}
}
}
findAllPaths(startNode, 1);
return [Math.min.apply(Math, paths), Math.max.apply(Math, paths)]
}
console.debug('ans',shortAndLong(QAndAObj, QAndAObj[1]));//returns [2, 4]
console.debug('ans',shortAndLong(QAndAObj, QAndAObj[2]));//returns [1, 3]
console.debug('ans',shortAndLong(QAndAObj, QAndAObj[3]));//returns [1, 2]
console.debug('ans',shortAndLong(QAndAObj, QAndAObj[4]));//returns [1, 1]
基础是
var lengthLongestPath = function(input) {
let maxLength = 0;
let pathLength = { 0: 0 }
let lines = input.split("\n");
for (let i = 0; i < lines.length; i++) {
let name = lines[i].replace(/\t/g,"");
let depth = lines[i].length - name.length;
if (name.includes(".")) {
maxLength = Math.max(maxLength, pathLength[depth] + name.length);
} else {
pathLength[depth + 1] = pathLength[depth] + name.length + 1;
}
}
return maxLength;
};
console.log(lengthLongestPath("dir\n\tsubdir1\n\tsubdir2\n\t\tfile.ext"))