laimas, ну я бы не сказал что нужна НО рекурсия работает быстрее чем цикл - и в моем случае больше подходит именно она...
И должен уточнить что это если не ошибаюсь это единственный алгоритм который правильно работает с шагом (с разным шагом!!!) = у Рони было хорошее решение пока я не посчитал кооличество циклов)))) - 4 это уж слишком)) Так же мне нужна была адекватная работа с переменными (идем от простого = чем проще тем лучше) - в примерах рони было просто оочень много новых переменных особенно порадовало создание массива в перевом цикле (2го примера - см. выше)... за это отдельное СПАСИБО, РОНИ потому как я бы наверное так не ухитрился бы сделать так что это было хорошим "уроком"... Вам тоже СПАСИБО, но больше за дискут нежели за код - так как я все равно не согласен с применением slice в данном вопросе )))) Если я найду еще вариант решения задачи - обязательно отпишусь - если нет - закрою тему. )))) |
Цитата:
А если еще раз подумать нужна ли она там, где задачей предписано смещаться (нет в массивах отступов, есть смещения) на одинаковую размерность вниз и в ширину? алгоритм который правильно работает с шагом (с разным шагом!!!) slice() может получать срезы любой размерности и что замечательно, о чем не должна болеть голова, это то, что он вернет остаток, если размерность указана больше его. Чтобы обойти массив по вашим условиям не нужно никакой рекурсии и более того, чем больше заданная размерность смещения, тем меньше проходов в цикле будет требоваться. так как я все равно не согласен с применением slice в данном вопросе Вольному воля, мне все равно, хоть с карандашом в руках решайте. ) Но стоит заметить, и также о применении рекурсии, где она де-факто как стандарт и очень вредный, это получение дерева из базы. В этой задаче все наоборот - из данных лежащих в навал нужно получить на выходе упорядоченный массив. А ведь рекурсия в данном случае тоже совсем не нужна. |
Цитата:
1. я сделал "через" рекурсию потому, что хотел реализовать с помощью нее (спортивный интерес) 2. нужна ли здесь рекурсия? Нет, не нужна 3. быстрее ли работает рекурсия? Нет, не быстрей Цитата:
|
Цитата:
однако, должен прояснить ситуацию - мне нужено было решение для с++(наверное зря не сказал раньше, но не думал что такая "шумиха" поднимится), поэтому и выбрал рекурсию, если отойти от этого факта тогда да slice вполне можно было бы использовать, однако должен заметить что код laimas не справляется с поставленной задачей если сменить размер смещения например с 2 на 3 , код падает: var a = [ ['01', '02', '03', '04'], ['05', '06', '07', '08'], ['09', '10', '11', '12'], ['13', '14', '15', '16'] ], b = [], i, s = [B]2[/B]; for(i = 0; i<a.length; i += s) { b.push([a[i].slice(0, s), a[i+1].slice(0, s)], [a[i].slice(s), a[i+1].slice(s)]) } console.log(b) |
Цитата:
З.Ы. - а так же из-за того что я задавал много (на сегодня уже тупых) вопросов, когда только начанал изучать js, так что не считаю это трагедией З.З.Ы - плюс ко всему у меня соотношение вопрос\ответ наверное 50\1 тагда как у вас наверное 1\1000 )))) |
сравнил скорости.... мда...:
http://jsperf.com/matrix-reader-with-index-offset |
Цитата:
|
laimas,
так написали бы псевдокод - зачем людей вводить в замешательство, и подписали бы что это концепция - и все счасливы все думаю головой и доводят концепт до ума... как я уже говрил я благодарен за дискут, но слушать о том что я не думую головой это уже крайность, что бы использовать ваш "концепт" его надо в корне переделать - могли просто остановить на первой версии коцепта который вы предложили Цитата:
|
Информация к размышлению: не существует в природе готовой функции slice(), забыли, это в принципе как то радикально изменит концепцию получения необходимых элементов массива?
|
Готовое решение с for:
var arr = [], step = 5, // offset between choosen positions size = 11; // grid size ~ 11x11 for(i = 0; i < size; i++) { // fill array arr.push([]); var str = ''; for(j = 0; j < size; j++) { arr[i][j] = i * size + j; str+=addZero(''+arr[i][j], 3)+', '; } console.log(str); // draw array } for( i = 0 ; i + size * step < arr.length * size; i+=step) { // use ' i+=step' to start from last X pos (ex. 0-1, 1-2), else use ' i+=step+1' to reduce repetition (ex. 0-1, 2-3) var row = Math.floor(i / size), column = Math.floor(i % size); if( row == Math.floor((i + step) / size) && row % step == 0) { console.log( '-----'+ arr[row][column]+","+ arr[row][column + step]+","+ arr[row + step][column]+","+ arr[row + step][column + step] ); } } function addZero(str,length) { // add 0 to fill str length while(str.length < length) { str = '0'+str; } return str; } |
Часовой пояс GMT +3, время: 06:22. |