Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 21.11.2015, 12:18
Новичок на форуме
Отправить личное сообщение для argab Посмотреть профиль Найти все сообщения от argab
 
Регистрация: 21.11.2015
Сообщений: 5

Помогите разобраться с алгоритмом
Друзья, в общем подкинули мне задачку, с которой за один вечер боюсь не уложиться.

Напишите ф-ю, к-рая принимала бы один параметр - натуральное число, на выходе же давала бинарное дерево, значение в корне которого было бы равно передаваемому числу, а структуры задавались бы таким образом, что сумма значений узлов-потомков равнялась значению родительского узла.

9
/ \
4 5
/ \ / \
2 2 2 3
/ \ / \ /\ /\
1 1 1 1 1 1 1 2
/\
1 1
У кого-нибудь есть соображения на этот счет?
Ответить с цитированием
  #2 (permalink)  
Старый 21.11.2015, 12:28
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,069

argab,
рекурсия деления числа на 2 пока больше 1
Ответить с цитированием
  #3 (permalink)  
Старый 21.11.2015, 13:09
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,069

argab,
примерно так
<script>
   function fn(num)
   {  var obj = {};
      var a = num/2|0, b = num - a;
      obj[a] = a > 1 ? fn(a) : a;
      obj[b+' '] = b > 1 ? fn(b) : b;
      return obj
   }
   console.log(fn(9))
   document.write(JSON.stringify(fn(9),null,1))
</script>
Ответить с цитированием
  #4 (permalink)  
Старый 21.11.2015, 14:45
Новичок на форуме
Отправить личное сообщение для argab Посмотреть профиль Найти все сообщения от argab
 
Регистрация: 21.11.2015
Сообщений: 5

Супер! Отлично
Ого! Не ожидал такого быстрого ответа, Спасибо! Скажите, есть ли где-нибудь подробное описание подобного алгоритма. Я с алгоритмами никогда не работал. В интернете искал, но там все про дельфи и паскаль.
Ответить с цитированием
  #5 (permalink)  
Старый 21.11.2015, 14:48
Новичок на форуме
Отправить личное сообщение для argab Посмотреть профиль Найти все сообщения от argab
 
Регистрация: 21.11.2015
Сообщений: 5

"рекурсия деления числа на 2 пока больше 1" - как ни странно, эта мысль у меня тоже сразу возникла, но с реализацией у меня проблемы были. Спасибо, что помогли.

А что означает сея конструкция: num/2|0.
Ответить с цитированием
  #6 (permalink)  
Старый 21.11.2015, 14:49
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,069

Сообщение от argab
есть ли где-нибудь подробное описание
может где-то и есть, искать надо и вывод результата в предложенном варианте не самый лучший, а именно obj[b+' '], но другого на скорую руку не нашёл для случая когда a и b одинаковые
Ответить с цитированием
  #7 (permalink)  
Старый 21.11.2015, 14:52
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,069

Сообщение от argab
А что означает сея конструкция
а вы поэкспериментируйте какой она результат выдаёт
замена Math.floor(num/2) -- наименьшее целое после деления на 2
Ответить с цитированием
  #8 (permalink)  
Старый 21.11.2015, 14:53
Новичок на форуме
Отправить личное сообщение для argab Посмотреть профиль Найти все сообщения от argab
 
Регистрация: 21.11.2015
Сообщений: 5

И вот этот момент не понятен: obj[b+' ']. Зачем нужен пробел?
Ответить с цитированием
  #9 (permalink)  
Старый 21.11.2015, 14:55
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,069

argab,
округление
Ответить с цитированием
  #10 (permalink)  
Старый 21.11.2015, 14:57
Новичок на форуме
Отправить личное сообщение для argab Посмотреть профиль Найти все сообщения от argab
 
Регистрация: 21.11.2015
Сообщений: 5

Вы наверно будете смеяться, но вот что я состряпал когда пытался:

var values = [],
i = 0;

function binaryTree(num)
{
sum = Math.floor(num/2);
ssum = ((sum*2)!=num) ? num - sum : sum;
if(num==1) return;

values[i] = [];
values[i].push(sum);
values[i].push(ssum);
++i;
binaryTree(sum);
}
binaryTree(9);
console.log(JSON.stringify(values,null,1));

Потом поздно было, решил башку не ломать, и написал сюда))
Ответить с цитированием
Ответ


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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите разобраться с this uroboros7 jQuery 4 02.01.2015 00:56
Помогите разобраться с калькулятором Maksim858 Ваши сайты и скрипты 1 27.12.2014 13:23
Помогите разобраться с алгоритмом паралакса nesfiraty Общие вопросы Javascript 1 23.09.2014 20:46
Получение ответа сервера через iframe и xhr. Помогите разобраться. Arconas AJAX и COMET 0 26.02.2013 10:38
Помогите разобраться с галереей IMAGIN yana_studio Общие вопросы Javascript 4 12.12.2009 17:24