Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 18.05.2017, 20:53
Аватар для maternik
Аспирант
Отправить личное сообщение для maternik Посмотреть профиль Найти все сообщения от maternik
 
Регистрация: 15.10.2013
Сообщений: 31

Рекурсия при обходе дерева
Я сочиняю функию , которая получает массив mas (он задаёт структуру дерева) и массив с параметрами param, которые нужно сложить по правилу в зависимости от заданной структуры дерева. Для приведённого примера ввода на выход приходит массив сумм [ 5, 4, 3, 2, 1, 2, 1, 2, 1 ], а ожидался [ 9, 8, 7, 2, 1, 2, 1, 2, 1 ]. Причина в цикле, в котором происходит рекурсивный вызов функции. Цикл выполняется, но набранная сумма теряется. Как это исправить?
onload = function() {
var mas2=[[1],[2],[3,5,7],[4],[],[6],[],[8],[]]; 
var param=[1,1,1,1,1,1,1,1,1];
var out=[],f=0;
var N=param.length; 
for (var i=0; i<N;i++){
  out[i]=recurs(i);
}
console.log(out);
function recurs(i){ 
  if (mas2[i].length==0) { 
    f= param[i] ;
  } else{
    var Nc=mas2[i].length;
    for (var j=0; j<Nc; j++){ 
      f= param[i]+
	  recurs(mas2[i][j]);
    }
 }
 
 return f;
 }
 
 }

Массив mas задаёт следующее правило: в его i-м элементе находятся номера элементов, которые являются дочерними для i-го. Так как в массиве param все единицы, то функция вернёт количество элементов от i-го до концевого, которые находятся в цепочке под i-м.
Ответить с цитированием
  #2 (permalink)  
Старый 18.05.2017, 21:17
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,127

подожду переводчика
Ответить с цитированием
  #3 (permalink)  
Старый 18.05.2017, 21:37
Аватар для maternik
Аспирант
Отправить личное сообщение для maternik Посмотреть профиль Найти все сообщения от maternik
 
Регистрация: 15.10.2013
Сообщений: 31


Первый элемент выходного массива получается при обходе дерева как на рисунке: начинаем с элемента с номером 0, каждый следующий даёт +1. Должно получиться 9.
Второй элемент выходного массива получится аналогично, но начнём с элемента с номером 1, поэтому сумма будет 8 и т.д.
В цикле затираются суммы для веток 3-4 и 5-6, поэтому в сумме не 9, а 5. Вот как бы
Ответить с цитированием
  #4 (permalink)  
Старый 18.05.2017, 21:59
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,127

maternik,
var mas2 = [
        [1],
        [2],
        [3, 5, 7],
        [4],
        [],
        [6],
        [],
        [8],
        []
    ];
    var param = [1, 1, 1, 1, 1, 1, 1, 1, 1];
    var out = [];
    var N = param.length;
    for (var i = 0; i < N; i++) out[i] = recurs(i);
    alert(out);

    function recurs(i) {
        var f = param[i];
        if (mas2[i].length) {
            var Nc = mas2[i].length;
            for (var j = 0; j < Nc; j++) f += recurs(mas2[i][j])
        }
        return f
    }
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
При запуске теста вопросы в произвольеном порядке Dr.Maksss Элементы интерфейса 13 30.09.2015 21:53
Как восстановить инфу из sessionStorage при выполнении определенных условий? ligisayan jQuery 1 26.06.2015 09:34
Смена класса у отдельного div при нажатии на ссылку Maxim-Ra Элементы интерфейса 6 15.02.2015 12:20
Изменение прозрачности при клике AJIUK jQuery 8 09.03.2014 16:00
при нажатии на раздел меню поворачивается маркер Сергей545 Элементы интерфейса 5 08.12.2013 22:15