Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Штудирую книгу ильи) усложнил себе задание (https://javascript.ru/forum/events/52263-shtudiruyu-knigu-ili-uslozhnil-sebe-zadanie.html)

kaflan 10.12.2014 17:00

Штудирую книгу ильи) усложнил себе задание
 
вот тут решил хитрую штуку замутить, и сделать через while рекурсию парсить) и не выходит.
var num = prompt("число",2);
var exp = prompt("степень", 10);
var result = 1;
var cnt = 1;
function pow(num, exp){
    
while(cnt<=exp){
    result*=num;
    cnt++;    
   }
     return alert(result);}

мб помогут разобраться где я делю ошибку, через цикл фор все должно прекрасно работать а с вайлом беда) давайте раберемся ребята)

рони 10.12.2014 23:55

kaflan,
function pow(){
var num = prompt("число",2);
var exp = prompt("степень", 10);
var result = 1;
var cnt = 1;
while(cnt<=exp){
    result*=num;
    cnt++;
   }
     return result}
alert(pow());

krutoy 11.12.2014 01:14

А в чем проблема? Твой код работает
var num = prompt("число",2);
var exp = prompt("степень", 10);
var result = 1;
var cnt = 1;
function pow(num, exp){
     
while(cnt<=exp){
    result*=num;
    cnt++;   
   }
     return alert(result);}

pow(num, exp)

Проблема в том, что ты ее не вызвал?:)
Или "рекурсию парсить" не получается? Попробуй через моноид, в категории эндофункторов.

kaflan 11.12.2014 11:55

Цитата:

Сообщение от krutoy
А в чем проблема? Твой код работает

ракую, просто не знал как рекурсивно ее вызвать спс. это мне очень поможет

kaflan 11.12.2014 11:56

Цитата:

Сообщение от krutoy
Проблема в том, что ты ее не вызвал?
Или "рекурсию парсить" не получается? Попробуй через моноид, в категории эндофункторов.

кикието магические слова, для меня ещенемного и ктулху призовешь)

krutoy 11.12.2014 16:33

Цитата:

Сообщение от kaflan
как рекурсивно ее вызвать

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

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

kaflan 12.12.2014 01:03

Цитата:

Сообщение от krutoy
Парсинг -- это обработка текста, грубо говоря.

ну да

kaflan 12.12.2014 01:04

Цитата:

Сообщение от kaflan
Классический пример -- рекурсивный факториал.

дай сцыль. или код... рекурсия в рекурсии это сдорово

krutoy 12.12.2014 01:22

Цитата:

Сообщение от kaflan
дай сцыль. или код... рекурсия в рекурсии это сдорово

fact=function(n){if(n<2) return n; return n*fact(n-1)}
alert(fact(5))
// 120

И нет тут никакой рекурсии в рекурси, это просто рекурсия. И это не здорово, просто иногда бывает удобней написать рекурсивно, например, при обходе дерева, но в общем случае, такого кода надо избегать, так как это дерьмо отжирает много памяти. Любой рекурсивный код можно переписать в виде цикла.

kaflan 12.12.2014 11:31

Цитата:

Сообщение от krutoy
так как это дерьмо отжирает много памяти

да это единственный минус) пожалуй

kaflan 14.12.2014 16:12

такнашел еще интересное задание по циклам).
Цитата:

Шахматная доска

Напишите программу, создающую строку, содержащую решётку 8х8, в которой линии разделяются символами новой строки. На каждой позиции либо пробел, либо #. В результате должна получиться шахматная доска.

# # # #
 # # # #
# # # #
 # # # #
# # # #
 # # # #
# # # #
 # # # #


рони 14.12.2014 16:35

kaflan,
на форуме есть ответы :victory:
Цитата:

Сообщение от kaflan
Шахматная доска

если поискать ))) но интереснее же самому :victory:

kaflan 14.12.2014 18:15

var spc = " ";
var num = "#";
var lines = +prompt("число линий", 8);
var row = +prompt("число символов в строке включая ' ' ",8);
var result = "";
for(var i = 0; i < lines; i++ ) {
    for(var n = 0; n < row; n++) {
        if (row%2==0) { 
            if (lines%2 == 0) {
                result += num;
            } else {
                result += spc;
                 }
            
        } else{ if(line % 2 == 0) {
                    result+=spc;
                }else {
                    result+=num;
                }
          }
    }
    
console.log(result);
}

как то так. вот) склепал ) еще не тестил но кажеться я на правильном пути постигания матана в джава скрипте)

http://jsfiddle.net/Kaflan/qd0gLenn/8/ ох матан идет тугенько.... путаюсь пока с двумя циклами которые должны давать , результат результата пока нет, того что нужен нет доски а есть не понятная штука. годный инструмент для создания рандомной карты...

Erolast 15.12.2014 11:37

Жутко усложняешь. Весь перебор можно уместить в пять строк.
И поработай над форматированием, оно у тебя жутко хромает, читать невозможно)

kaflan 15.12.2014 12:51

я учусь. кароче не значит, читабельне.
 
Цитата:

Сообщение от Erolast (Сообщение 346572)
Жутко усложняешь. Весь перебор можно уместить в пять строк.
И поработай над форматированием, оно у тебя жутко хромает, читать невозможно)

ПОработать над форматированием?.... ок. просто не успел нажать tidy up. и все норм читаеться... 5 строкэто здорово, но это будет наверное малопонятная для начинающего формула. Пример очень хорош.
http://jsfiddle.net/Kaflan/qd0gLenn/11/ вот подскажи как укоротить чтобы даже новичек понял код

Erolast 15.12.2014 13:20

Цитата:

просто не успел нажать tidy up.
Надо уметь нормально форматировать без всяких tidy up, самому ж удобней будет.
Цитата:

и все норм читаеться...
А могло бы намного лучше.

Цитата:

5 строкэто здорово, но это будет наверное малопонятная для начинающего формула.
Да нет, все элементарно:
var result = "\n";
for (var row = 1; row <= 8; row++) {
  for (var cell = 1; cell <= 8; cell++) {
    result += (row % 2 == cell % 2) ? "#" : " "; //Можно еще побитово - (row & 1 == cell & 1)
  }
  result += "\n";
}
console.log(result);

Вообще, есть золотое правило - чем код короче, тем он лучше.

melky 15.12.2014 15:50

Цитата:

Сообщение от Erolast
Вообще, есть золотое правило - чем код короче, тем он лучше.

ты бы пояснил, что имеешь в виду.

вот золотые правила: http://habrahabr.ru/post/144611/. Но там нет SOLID, так что принципов может быть немного больше :)

Erolast 15.12.2014 16:24

Имею в виду, что чем короче код, тем проще его писать, читать, вспомнить и расширять. Естественно, я не о количестве символов, а о количестве логики.

kaflan 15.12.2014 17:03

Цитата:

Сообщение от Erolast
Да нет, все элементарно:

спасибо я покадо такого немогу додуматься.... а поводу краткости... тут палка двух концов, если функция не рекурсивная то такой код хорошо, но если рекурсивная функция глубокая то это может немного поламать читабельность

Erolast 15.12.2014 17:12

Цитата:

а поводу краткости... тут палка двух концов, если функция не рекурсивная то такой код хорошо, но если рекурсивная функция глубокая то это может немного поламать читабельность
Чо? При чем тут рекурсия?

рони 15.12.2014 17:25

:)
<script>
   var a = Array(5).join('#_'),
       b = Array(5).join('_#'),
       c = Array(5).join(a + '<br>' +b + '<br>');
    document.write(c)
</script>

Erolast 15.12.2014 18:56

Конкурс извратов? :)
var result = "";
for (var i = 1; i <= 8; i++)
    result += "#_".repeat(4).split("")[i & 1 ? "slice" : "reverse"]().join("") + "\n";
alert(result);

kaflan 19.12.2014 11:14

Цитата:

Сообщение от Erolast (Сообщение 346668)
Конкурс извратов? :)
var result = "";
for (i = 1; i <= 8; i++)
    result += "#_".repeat(4).split("")[i & 1 ? "slice" : "reverse"]().join("") + "\n";
alert(result);

крут. продолжаю изучать книгу выразительный джаваскрипт.
Цитата:

Считаем бобы. Символ номер N строки можно получить, добавив к ней .charAt(N) ( “строчка”.charAt(5) ) – схожим образом с получением длины строки при помощи .length. Возвращаемое значение будет строковым, состоящим из одного символа (к примеру, “к”). У первого символа строки позиция 0, что означает, что у последнего символа позиция будет string.length – 1. Другими словами, у строки из двух символов длина 2, а позиции её символов будут 0 и 1. Напишите функцию countBs, которая принимает строку в качестве аргумента, и возвращает количество символов “B”, содержащихся в строке. Затем напишите функцию countChar, которая работает примерно как countBs, только принимает второй параметр — символ, который мы будем искать в строке (вместо того, чтобы просто считать количество символов “B”). Для этого переделайте функцию countBs.
вот не пишите решение хочу пока сам потом, вам на проверку закину )

kaflan 19.12.2014 16:28

var result = 0;

function countChar(b, n) {
    for (var i = 0; i < b.length; i++) {
        if (b.charAt(i) == n) {
           result += i;
        }
    }console.log(result);
}
console.log(countChar("hendhendhend", "e"))

полчуаеться 15. хотя должно быть 3. я даже понимаю чего 15, но не понимаю чего оно 3 не показует. наверное я еще что то путаю) подсобите

рони 19.12.2014 16:58

Цитата:

Сообщение от kaflan
result += i;

медитируйте до просветления -- как это может дать 3

kaflan 19.12.2014 17:51

Цитата:

Сообщение от рони (Сообщение 347268)
медитируйте до просветления -- как это может дать 3

подсказку понял)
http://jsfiddle.net/Kaflan/6tcogb16/6/
как то так

рони 19.12.2014 18:04

Цитата:

Сообщение от kaflan
подсказку понял)

и как теперь выглядит эта строка?

Erolast 20.12.2014 10:08

Много лишних действий. Зачем ты собираешь из совпадений строку и возвращаешь ее длину, когда можно просто возвратить количество совпадений? И называй переменные понятно, что значат эти твои b, n?

рони 20.12.2014 10:46

Цитата:

Сообщение от Erolast
Зачем ты собираешь из совпадений строку и возвращаешь ее длину

и где?

Erolast 20.12.2014 11:52

Цитата:

var result = "";
result += b.charAt(i);
console.log(result.length);
А еще result объявляется не в той области видимости, где используется.

рони 20.12.2014 12:05

Erolast,
понял вы смотрите код в песочнице ... незаметил что ссылку туда добавили.

kaflan 22.12.2014 12:50

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

рони 22.12.2014 13:29

kaflan, а счастье было так близко ...
function countChar(b, n) {var result = 0;
    for (var i = 0; i < b.length; i++) {
        if (b.charAt(i) == n) {
           result ++;
        }
    }return result;
}
alert(countChar("hendhendhend", "e"))

kaflan 22.12.2014 14:23

друг мой, ракую спасибо
 
Цитата:

Сообщение от рони (Сообщение 347618)
kaflan, а счастье было так близко ...
function countChar(b, n) {var result = 0;
    for (var i = 0; i < b.length; i++) {
        if (b.charAt(i) == n) {
           result ++;
        }
    }return result;
}
alert(countChar("hendhendhend", "e"))

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

Erolast 22.12.2014 15:24

Ну так выкладывай.

kaflan 22.12.2014 21:33

Цитата:

Сообщение от Erolast (Сообщение 347654)
Ну так выкладывай.

http://jsfiddle.net/Kaflan/ooy2k918/7/
вот как то так) очень классная книга..... мое мышление становиться математическим это так замечательно.

krutoy 22.12.2014 21:51

Цитата:

Сообщение от kaflan
мое мышление становиться математическим это так замечательно.

Для мат мЫшления ты не тот ЯП выбрал. Бери какую-нибуль быдлостатику, особенно хаскель для этого дела подходит. Будешь там факториалы считать до посинения через монады в категории эндофункторов. Наградят тебя потом почетным орденом выдающегося вычисляльщика.

kaflan 22.12.2014 21:56

Цитата:

Сообщение от krutoy (Сообщение 347740)
Для мат мЫшления ты не тот ЯП выбрал. Бери какую-нибуль быдлостатику, особенно хаскель для этого дела подходит. Будешь там факториалы считать до посинения через монады в категории эндофункторов. Наградят тебя потом почетным орденом выдающегося вычисляльщика.

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

krutoy 22.12.2014 21:59

kaflan,
Я пошутил, не бери в голову:)

krutoy 22.12.2014 22:03

Цитата:

Сообщение от kaflan
если можно сделать программу которая за тебя все сделает

Ты кстати, прав, надо пейсать программы, которые сами пишут программы, это метапрограммирование называется. ЖС как раз такой язык, он унаследовал это от старых лиспов. Только это не в почете щас.


Часовой пояс GMT +3, время: 12:17.