Javascript FOR循环中的递归
我在for循环中使用递归:Javascript FOR循环中的递归,javascript,recursion,Javascript,Recursion,我在for循环中使用递归: var matrix = [ [0, 1, 1, 0, 0], [1, 0, 1, 1, 1], [1, 1, 0, 1, 0], [0, 1, 1, 0, 1], [0, 1, 0, 1, 0] ]; var startVertex = 1; var vertices = []; var lastTakenOff = -1; var findHamilton = function (v) { for (var i = 0
var matrix = [
[0, 1, 1, 0, 0],
[1, 0, 1, 1, 1],
[1, 1, 0, 1, 0],
[0, 1, 1, 0, 1],
[0, 1, 0, 1, 0]
];
var startVertex = 1;
var vertices = [];
var lastTakenOff = -1;
var findHamilton = function (v) {
for (var i = 0; i < matrix[v].length; i++) {
if (matrix[v][i] === 1 && vertices.indexOf(i) === -1 && i > lastTakenOff &&
vertices.length < matrix[v].length) {
vertices.push(i);
console.log(vertices)
lastTakenOff = -1;
return findHamilton(i);
} else if (vertices.length < matrix[v].length) {
console.log(vertices);
lastTakenOff = vertices.pop();
return findHamilton(vertices[vertices.length - 1]);
}
}
};
vertices.push(startVertex);
findHamilton(startVertex);
console.log(vertices)
var矩阵=[
[0, 1, 1, 0, 0],
[1, 0, 1, 1, 1],
[1, 1, 0, 1, 0],
[0, 1, 1, 0, 1],
[0, 1, 0, 1, 0]
];
var startVertex=1;
var顶点=[];
var lastTakenOff=-1;
var findHamilton=函数(v){
对于(var i=0;i<矩阵[v]。长度;i++){
如果(矩阵[v][i]==1&&vertices.indexOf(i)===1&&i>lastakenoff&&
顶点.长度<矩阵[v].长度){
顶点。推(i);
console.log(顶点)
lastTakenOff=-1;
返回findHamilton(i);
}else if(顶点.length<矩阵[v].长度){
console.log(顶点);
lastTakenOff=顶点.pop();
返回findHamilton(顶点[vertices.length-1]);
}
}
};
顶点。推(startVertex);
findHamilton(startVertex);
console.log(顶点)
经过3次迭代,我得到了一个错误:矩阵[v]在for循环中未定义。如果我没有“其他如果”,一切都好。在if-else中如何使用递归
编辑:
我添加了我所有的代码,更改如下:
startVertex = 1;
为此:
startVertex = 0;
我想你是从位置1开始的,但实际上是从0开始的4深。如果从1开始,则到达数组结束计数的时间比数组长度早
看看这是否有效您从顶点保留.pop(),我永远看不到您是否检查它的长度是否达到0
如果试图检索-1索引,矩阵和顶点将始终崩溃
我会检查更多,但这是我第一次怀疑你的代码
添加1:
我注意到您正在嵌套函数,但您永远不会返回与另一个函数不同的任何内容,因此您将继续嵌套,直到返回您不知道的内容,否则堆栈将溢出。这也很糟糕
添加2:
为了执行您的测试,我可以看到几十种不需要嵌套的解决方案
if ( matrix.length > 0 && matrix.length == matrix[0].length)
{
for(var i = 0; i < matrix.length; i++)
for(var j = 0; j < i; j++)
If (matrix[i][j] != matrix[j][i])
return false;
return true;
}
if(matrix.length>0&&matrix.length==矩阵[0].length)
{
对于(变量i=0;i
这是一个想法…问题或其中之一是这句话
返回findHamilton(顶点[vertices.length-1])
findHamilton正在等待int参数,但vertices[vertices.length-1]
可能是未定义的
所以我不知道这是否会返回您等待的值,但请尝试以下方法:
var matrix = [
[0, 1, 1, 0, 0],
[1, 0, 1, 1, 1],
[1, 1, 0, 1, 0],
[0, 1, 1, 0, 1],
[0, 1, 0, 1, 0]
];
var startVertex = 1;
var vertices = [];
var lastTakenOff = -1;
var findHamilton = function (v) {
for (var i = 0; i < matrix[v].length; i++) {
if (matrix[v][i] === 1 && vertices.indexOf(i) === -1 && i > lastTakenOff &&
vertices.length < matrix[v].length) {
vertices.push(i);
console.log(vertices)
lastTakenOff = -1;
return findHamilton(i);
} else if (vertices[vertices.length - 1] && v < matrix.length && vertices.length < matrix[v].length) {
console.log(vertices);
lastTakenOff = vertices.pop();
return findHamilton(vertices[vertices.length - 1]);
}
}
};
vertices.push(startVertex);
findHamilton(startVertex);
console.log(vertices)
var矩阵=[
[0, 1, 1, 0, 0],
[1, 0, 1, 1, 1],
[1, 1, 0, 1, 0],
[0, 1, 1, 0, 1],
[0, 1, 0, 1, 0]
];
var startVertex=1;
var顶点=[];
var lastTakenOff=-1;
var findHamilton=函数(v){
对于(var i=0;i<矩阵[v]。长度;i++){
如果(矩阵[v][i]==1&&vertices.indexOf(i)===1&&i>lastakenoff&&
顶点.长度<矩阵[v].长度){
顶点。推(i);
console.log(顶点)
lastTakenOff=-1;
返回findHamilton(i);
}else if(顶点[vertices.length-1]&&v
我刚刚编辑了else if
谓词您没有显示矩阵是什么或它包含什么。这可能是问题的根源。递归需要一个基本情况和对自身的函数调用。If/Else几乎总是用来确定是返回值还是调用函数。你能给我更多的提示如何修复它吗?请发布所有代码,其中定义了矩阵
和顶点
如果你不发布整个代码,我们无法帮助你。顶点值将进入这个函数中是什么?或者根据你希望获得的getwait,切换[0]和[v],为什么从startVertex=1开始?这不应该是startVertex=0吗?不,它不重要,它是1
还是0
。在这个矩阵示例中,我可以使用0到4之间的startVertex
。在这个startVertex和这个矩阵中,如果不执行,则不应执行else。在某种程度上是这样的,我想知道如何修复。例如,如果您删除所有,否则如果,并且只有如果,则一切正常。如果startVertex=2
,则需要此“else if”。