Вопрос относительно использования рекурсии и использования переменных - PullRequest
0 голосов
/ 06 мая 2020

Я написал эту рекурсивную функцию, которая вела себя странно, мне потребовалось несколько часов, чтобы она заработала. Я использую его для обхода объекта JSON, такого как древовидная структура, для поиска узлов, которые имеют значение в schedulePoint. Я заметил кое-что, что немного сбило меня с толку, и я надеялся, что кто-то сможет пролить свет на то, почему. Я прокомментировал код ниже, в котором была проблема. Для меня, по крайней мере, логически, это не выглядит иначе. Тем не менее, когда я использовал закомментированный код вместо этого, рекурсия не завершалась, я продолжал получать пустой массив. Он будет go через одно поддерево, затем очистит массив перед запуском следующего. Я просто хотел бы знать, как влияет использование переменной на рекурсию. Любая помощь будет оценена. Он написан на DGScript, языке сценариев, похожем на javascript. Кроме того, если вы видите что-то лишнее или что можно было бы написать более эффективно, я был бы признателен за совет.

function findSchedules(name, jsonNode)
{
  if (hasChildren(jsonNode) == false)
  {
    data = csvToJSON(jsonNode['?value']);
    dataPath = data['dataPath'];
    schedulePoint = data['schedulePoint'];

    if (schedulePoint != "" && schedulePoint != null && schedulePoint != "NO SCHEDULE")
      return [[name, dataPath, csvToJSON(jsonNode['?value'])['schedulePoint']]];
    else
      return [];
  }

  schedules = [];

  for (node in jsonNode)
  {
    if (isValidNode(node) == true)
      schedules = schedules.concat(findSchedules(node, jsonNode[node]));
      /*
          If instead I wrote:

          if (isValidNode(node) == true)
          {
            prevSchedules = findSchedules(node, jsonNode[node]);
            schedules = schedules.concat(prevSchedules);
          }

          which is what I had originally, the recursion would not work correctly. Why are these two 
          statements different?
      */
  }

  data = csvToJSON(jsonNode['?value']);
  dataPath = data['dataPath'];
  schedulePoint = data['schedulePoint'];

  if (schedulePoint != "" && schedulePoint != null && schedulePoint != "NO SCHEDULE")
    schedules.push([name, dataPath, schedulePoint]);

  return schedules;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...