Общий вопрос об использовании For Loops And Recursion - PullRequest
0 голосов
/ 20 марта 2020

В настоящее время я пытаюсь изучить рекурсию и работаю над созданием собственной функции JSON.stringify с использованием рекурсии. До сих пор я не использовал for loops ни для одной из проблем, которые я сделал. Разрешено ли использование for loop в рекурсии? Пример моего кода.

function stringify(object) {
  var string = '{';
  for (var key in obj) {
      if (obj[key] === undefined) {
        return string += '}';
      } else {
        return string += key.toString() + obj[key].toString() + stringify(object);
      }
  }
}

Теперь я знаю, что когда stringify(object) выполнится, он снова начнет for loop с первого свойства object, что приведет к бесконечному l oop. Мой вопрос: можно ли использовать for loop при попытке создать функцию с использованием рекурсии? Или я должен изменить свой подход к этой проблеме и избежать for loop. Я просто действительно ищу руководство по подходу к этой проблеме, а не какие-либо прямые ответы кода. Спасибо!

Ответы [ 2 ]

0 голосов
/ 21 марта 2020

Если вы хотите сделать это без всего oop, вы можете сделать что-то вроде этого:

function stringify(obj, raw) {
  let [[k, v], ...rest] = Object.entries(obj), // Take the first entry and the rest
    r = k + ": ";

  // Process the first entry in the object  
  if (typeof v == "object") {
    r += stringify(v); // recursively call for inner objects
  }
  else {
    r += v;
  }

  // Process the remaining entries (if there are more)
  if (rest.length) {
    r += ", " + stringify(Object.fromEntries(rest), true);  // recursively call for remainder of present object
  }

  // Wrap the string in {} if needed
  if (raw) {
    return r;
  }
  else {
    return "{" + r + "}";
  }

}

console.log(stringify({x: 10, y: 5, params: {a: 3, b: 4}}));

Одним недостатком является то, что для больших объектов вы можете столкнуться с проблемами максимальной глубины рекурсии. Этого можно избежать, если добавить al oop в рекурсивную функцию. Вы также должны подумать о том, как бы вы работали с массивами (игнорируется в коде выше).

0 голосов
/ 20 марта 2020

ваше условие if никогда не выполняется, поэтому оно всегда выполняет оператор else и снова вызывает его себя.
при использовании рекурсий вы должны учитывать конечное условие, которое, когда ваш l oop достигает условия, не больше не вызывайте себя.
в вашем примере вы должны вызывать функцию, когда она достигает объекта внутри данного объекта, рекурсия заканчивается, когда не осталось ни одного объекта. в настоящее время вы снова вызываете весь объект внутри себя, это приводит к бесконечному l oop

      var myObj = { a: 1, b: 2, c: 3, d: { r: 4, t: 5 } };

      function stringify(object) {
        let string = "";
        for (let key in object) {
          string +=
            key.toString() +
            " : [" +
            (typeof object[key] == "object"
              ? stringify(object[key])
              : object[key].toString()) +
            "] " ;
        }
        return string;
      }

      console.log(stringify(myObj));
...