Timkor

commaSeparatedOptimisation

Feb 4th, 2021 (edited)
293
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*Задача на тему циклы, треба вивести на екран парні числа от 2 до N, через кому*/
  2.  
  3. let number = +prompt('Введіть, будь ласка, число?');
  4. for (let a = 1; a <= number; a++) {
  5.     if (a % 2 === 0) {
  6.         console.put(a + (a === number ? "\n" : ", "));
  7.     }
  8. }
  9.  
  10. /* Далі йде факультативна інформація, якщо вона здастся вам зайвою чи не зрозумілою на цьому етапі - сміливо пропускайте , вона не допоможе вчитися, а без неї ви нічого не втратите в розвитку!
  11.  
  12.  
  13. Такий варіант є звичним, але має свої недоліки: так на кожній ітерації нам доводиться перевіряти, чи парне значення змінної а,  а чи не рівна змінна а змінній number - щоб чи ставити кому, чи ні. Ці перевірки, звісно, виконуються компьютером досить швидко, як і інші операції, але все одно на кожну з них компьютер втрачає час. Якщо можемо уникнути будь якої операції в алгоритмі, а значить і в коді - маємо виграш у часі, в програмуванні кажуть: " зменьшуємо складність алгоритма за часом ". У вашому попередньому варіанті  перевірки на рівність a === number  не було - тобто ваш алгоритм був більш ефективний, бо мав меншу складність за часом (O(n) - о велике від н - так записуються складність за часом, https://uk.wikipedia.org/wiki/%D0%A7%D0%B0%D1%81%D0%BE%D0%B2%D0%B0_%D1%81%D0%BA%D0%BB%D0%B0%D0%B4%D0%BD%D1%96%D1%81%D1%82%D1%8C_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%83
  14. ).
  15.   Практично кожне завдання можна виконати різними алгоритмами - ваш первісний варіант був водночас простий та ефективний. Пропоную саме його вдосконалити: */
  16.  
  17. let number = +prompt('Введіть, будь ласка, число?');
  18. let a; /* ця змінна нам знадобиться після циклу, тому виніс її з нього до наружного блока коду (скоупа). Інакше, якщо створити її (let a) в середині циклу, то вона існуватиме тільки там і зовні її не буде */
  19. for (a = 2; a < number - 1; a += 2) { /* замінив знак =< на < та ітеруємось до number - 1,  щоб не дістатися передостаннього та останнього елементів, починаємо з 2, крокуємо +2  - лише по парним*/
  20.         console.put(a + ", ");
  21. }
  22. /* тепер наш цикл пройшов супероптимально - не було жодної з перевірок (окрім a < number - 1;), та ітерацій вдвічи меньше ніж number , бо ж крокували лише по парним - через +2. Але тепер залишилось ще два (чи не два?) елементи, що з ними робити.. Може так: */
  23. if (a % 2 === 0) {  // поміркуйте, як можемо позбавитися цієї перевірки  - відповідь нижче)))
  24.         console.put(a);
  25. } else {
  26.     console.put(a + 1);
  27. }
  28.  
  29.  
  30.  
  31.  
  32.  
  33.  
  34.  
  35.  
  36.  
  37.  
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  
  44.  
  45.  
  46. let n = +prompt('Введіть, будь ласка, число?');
  47. let a;
  48. for (a = 2; a < n - 1; a += 2) {
  49.         console.put(a + ", ");
  50. }
  51. /* насправді після нашого циклу перевірка if (a % 2 === 0) зайва, бо після нашого циклу змінна а завжди  буде парною: ми починаємо із значення 2, та на кожній ітерації додаємо теж 2. Отже можна просто вивести її без коми */
  52.  
  53. if (a <= n) { // і без цієї перевірки працює, але введіть n = 1, чи будь-яку меншу за 2
  54.     console.log(a);
  55. }
  56.  
  57. /* залишилось дотриматися умови завдання і зробити так, щоб команда виводу у консоль була одна на весь код  - можна використати змінну у яку дописувати значення, та вивести її після того як все зроблено .
  58. */
  59.  
  60. // Гарного коду.
Add Comment
Please, Sign In to add comment