Javascript 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

我在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; 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”。