Рекурсия (Javascript) - не завершает рекурсию из оператора «IF» - PullRequest
0 голосов
/ 22 ноября 2018

Я изучаю рекурсию в Javascript, и вот что я получил до сих пор.Эта функция проходит по дереву и находит объект с подходящим именем.Поскольку начало должно быть задано как корень, я создал рекурсию для использования корня в качестве начальной точки.

Первый оператор if в цикле for на полпути должен возвращать совпадение.Я отладил части этого в консоли, поэтому я знаю, что возврат не работает по какой-то причине, о которой я не знаю (любое понимание было бы здорово для целей обучения!).

Журналы set consoleкак я и ожидаю, логическая проверка показывает, что совпадение действительно происходит, но в конце все равно становится неопределенным!

findInTree(name) {
    let start = this.first();   //root object of the tree

    function findName (start, name) {
      if (start.name === name) {
        return start;
      } else {
        for (let set of start.offspring) {
          if (set.name === name) {
            console.log(set);   // returns the correct set!
            console.log(set.name === name)  //returns true;
            return set;
          } else {
            findName(set, name);
          }
        }
      }
    }
    return findName(start, name);
  }
// returns undefined...

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Как вы думаете, это будет работать?Переместите рекурсивный вызов из цикла for.только если совпадение не найдено в цикле for, вы вызываете функцию findName.Если возможно, можете ли вы поместить свой код в jsfiddle или куда-нибудь, чтобы я мог посмотреть.

    findInTree(name) {
    let start = this.first();   //root object of the tree

    function findName (start, name) {
      if (start.name === name) {
        return start;
      } else {

        for (let set of start.offspring) {
          if (set.name === name) {
            console.log(set);   // returns the correct set!
            console.log(set.name === name)  //returns true;
            return set;
          }
        }
       return findName(set, name);   //if the match is not found in the forloop, we call findname

      }
    }
    return findName(start, name); 
}
0 голосов
/ 22 ноября 2018

Вы хотите вернуться из цикла только в том случае, если рекурсия нашла то, что вы ищете.В противном случае вы хотите продолжать цикл.Вы можете проверить результат и решить, следует ли возвращать:

let obj = {
    first: {
        name: "test",
        offspring:[
            {name: "test1", offspring:[]},
            {name: "test2", offspring:[{name:"test21", offspring:[]}]},
            {name: "test3", offspring:[
                {name: "test31", offspring:[]}
            ]},
        ]
    },
    findInTree(name) {
    let start = this.first;   //root object of the tree

    function findName (start, name) {
      if (start.name === name) {
        return start;
      } else {
        for (let set of start.offspring) {
          if (set.name === name) {
            console.log(set);   // returns the correct set!
            console.log(set.name === name)  //returns true;
            return set;
          } else {
            let found = findName(set, name); // only return if you've found 
            if (found) return found          // what you're looking for
          }
        }
      }
    }
    return findName(start, name);
  }
}
console.log(obj.findInTree("test31"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...