Как рекурсивные функции ведут подсчет при поиске максимальной глубины двоичного дерева javascript

#javascript #recursion #binary-tree #recursive-datastructures

#javascript #рекурсия #двоичное дерево #рекурсивные-структуры данных

Вопрос:

  var maxDepth = function(root) {
     const recursion = (n) => {
         if (!n) return 0;
        
         let left = recursion(n.left)
         let right = recursion(n.right)
         return left > right ? left   1 : right   1
     }
     return recursion(root)
 };
 

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

Вот еще один метод поиска

   maxDepth() {
    if (!this.root) return 0;

    function maxDepthHelper(node) {
      if (node.left === null amp;amp; node.right === null) return 1;
      if (node.left === null) return maxDepthHelper(node.right)   1;
      if (node.right === null) return maxDepthHelper(node.left)   1;
      return (
        Math.max(maxDepthHelper(node.left), maxDepthHelper(node.right))   1
      );
    }

    return maxDepthHelper(this.root);
  }
 

это было частью метода класса двоичного дерева

Комментарии:

1. Что вы подразумеваете под » как это ведет учет? «? Он просто подсчитывает уровни рекурсивных вызовов.

Ответ №1:

Вы спрашиваете: «Как работает добавление 1 к вызову функции?» Обратите внимание, что maxDepthHelper(...) возвращает число. Итак, что происходит, так это то, что результатом вызова функции является число, и этот результат увеличивается на 1. Итак, если в конкретном случае maxDepthHelper(...) получено 6, то maxDepthHelper(...) 1 это всего лишь 7.

На ваш более общий вопрос: «Как он ведет подсчет?» Это не так. Стек вызовов будет содержать множество рекурсивных вызовов maxDepthHelper , и многие из этих вызовов будут выполняться 1 для возвращаемого значения. Эти дополнения накапливаются и в конечном итоге дают конечный результат. Та же идея и здесь:

 const count = (n = 0) => {
   if (n < 1000) {
       return count(n   1)
   }
   return n
}

count() // 1000
 

Здесь ничто не «отслеживается». n Переменная передается, и ее значение накапливается по мере увеличения стека вызовов.

Комментарии:

1. « var maxDepth = function(root) { const recursion = (n) => { if (!n) возвращает 0; пусть left = рекурсия (n.left) пусть right = рекурсия (n.right) возвращает left > right ? left 1 : right 1 } возвращает рекурсию (root) }; « итак, в этом примере переменная «left» содержит количество вызовов функций? если да, то что подсчитывает вызовы или как генерируется число?

2. В любом отдельном вызове функции релевантным значением может быть 0 числовой литерал или может храниться с помощью left или с помощью right . Дело в том, что нет переменной, отслеживающей общую сумму этих значений. Все числа передаются return вызывающей стороне, и вызывающая сторона увеличивает их на единицу, а затем возвращает результат вызывающей стороне и так далее, и так далее, неопределенное количество раз, пока не будет исчерпан стек вызовов — и это самое последнее возвращаемое значение является конечным результатом вычисления.