Когда я решил, что хочу стать программистом, самым большим препятствием, с которым я столкнулся, было нарушение мышления программирования. Когда я начал учиться программировать, для меня было очень сложно писать код, потому что для написания кода вам нужно сначала уметь решить проблему! Когда я смотрел на проблему, которую мне нужно было решить, я часто замирал и не знал, с чего начать. Есть материалы из Launch School, такие как видео по решению проблем, которые демонстрируют, как разложить проблему, что помогло мне выработать систематический подход к решению проблемы программирования. Я хотел поделиться различными шагами, которые я предпринимаю для решения проблем программирования, чтобы это могло помочь другому ученику, если он почувствует себя застрявшим.

1. Посмотрите, что такое ввод и вывод.

Мне нравится это делать, потому что это дает вам представление о том, какие методы вы должны использовать в своем коде. В качестве примера я буду использовать задачу, полученную мной от Codewars (уровень 5 кю).

# Write a method that takes a maximum bound and returns all primes 
# starting with 0 up-to and including the maximum bound.
# test case
prime_numbers(11) # should return [2,3,5,7,11]

В приведенном выше примере у нас есть целое число в качестве входных данных для метода prime_numbers, и мы возвращаем массив.

2. Прочтите проблему и сделайте заметки.

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

Давайте разберем данную проблему.

# Write a method that takes a maximum bound...

Максимальная граница - это целое число 11, которое передается в метод prime_numbers и будет обозначаться как n.

...and returns all primes starting with 0 up-to and including the maximum bound.

Мы хотим вернуть простые числа от 0 до максимальной границы n. Похоже, мы будем работать с диапазоном (0..n).

Таким образом, нам нужно вернуть все простые числа, которые находятся в диапазоне (0..n).

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

3. Какова логика того, чего я хочу достичь?

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

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

Нам нужно сначала проверить, больше ли возможное простое число, чем 1, потому что в противном случае оно не может быть простым числом. Затем нам нужно посмотреть, может ли какой-либо положительный делитель (кроме 1 и самого числа) делиться на возможное простое число поровну, потому что если он есть, то мы точно знаем, что число не является простым. Точно так же, если нет никакого положительного делителя (кроме 1 и самого числа), который можно разделить на возможное простое число поровну, то это число является простым.

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

4. Напишите псевдокод.

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

- Create an empty array called results to put all of the prime numbers in
- Iterate from 0 to the maximum bound number n, and for each number 
   - If the number is a prime number, put it into the results array
- Return the results array 

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

- Return false if number is less than or equal to 1
- Iterate from the integer 2 to the number passed into the method                minus 1, and for each divisor
   - If the number can be divided by the divisor evenly then return
     false
- If the number cannot be divided by the divisor evenly then return
  true            

5. Переведите псевдокод в код.

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

# - Create an empty array called results to put all of the prime  numbers in
def prime_numbers(n)
  results = []
end
# - Iterate from 0 to the maximum bound number n, and for each number
def prime_numbers(n)
  results = []
  (0..n).each do |num|
    
  end 
end
# - If the number is a prime number, put it into the results array
def prime_numbers(n)
  results = []
  (0..n).each do |num|
    results << num if prime?(num)
  end 
end
# - Return the results array
def prime_numbers(n)
  results = []
  (0..n).each do |num|
    results << num if prime?(num)
  end
  results
end

А теперь о методе prime?.

# - Return false if number is less than or equal to 1
def prime?(num)
  return false if num <= 1
end
# - Iterate from the integer 2 to the number passed into the method minus 1, and for each divisor
def prime?(num)
  return false if num <= 1
  (2..(num - 1)).each do |divisor|
  end 
end
# - If the number can be divided by the divisor evenly then return
    false
def prime?(num)
  return false if num <= 1
  (2..(num - 1)).each do |divisor|
    return false if num % divisor == 0
  end 
end
# - If the number cannot be divided by the divisor evenly then return true
def prime?(num)
  return false if num <= 1
  (2..(num - 1)).each do |divisor|
    return false if num % divisor == 0
  end 
  true 
end

6. Код рефакторинга.

Вот и готовый продукт! Если рефакторинг необходим, сейчас отличное время для этого.

def prime?(num)
  return false if num <= 1
  (2..(num - 1)).each do |divisor|
    return false if num % divisor == 0
  end 
  true 
end
def prime_numbers(n)
  results = []
  (0..n).each do |num|
    results << num if prime?(num)
  end
  results
end
prime_numbers(11) # should return [2,3,5,7,11]

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