Как научиться решать сложные задачи?
Я 3 года изучаю python, а так же изучил html, css, js, 1с и excel, но когда я начинаю решать сложную задачу, либо она по математики (я даже за 4 класс не могу решить, я в университете), либо не понятная, либо слишком сложная, прошёл примерно 20 курсов на разных сайтах, сделал 3 игры на пайтон и 2 текстовые, где была математика, я решал с дипсиком (потому что по физике у меня кое-как 3, почти 2), где не было, сам (это 70%), я не понимаю, как научиться решать сложные задачи и не понимаю, что делаю не так (практикуюсь почти каждый день на лёгких и средних). Функции будут переданы две функции f и g без параметров. Создайте функцию which_is_larger(f, g), которая вызывает их и возвращает "f", если f() больше, "g", если больше g(), и "neither", если они равны или сравнение невозможно (например, одна вернула None).
which_is_larger(lambda: 5, lambda: 10) ➞ "g" which_is_larger(lambda: 25, lambda: 25) ➞ "neither" например в этой задачи я вообще не понимаю смысла. Что делает тут lambda, сравнивать вообще не понятно как и что, ничего не понятно, для меня она слишком сложная
3 ответа
Привет! Три года кода и пять своих игр — программировать ты умеешь. В этой задаче тебя сбила не сложность, а формулировка: математики здесь ноль, нужно просто сравнить два числа.
Про lambda. lambda: 5 — это не число 5, а крошечная функция без аргументов, которая вернёт 5, когда её вызовешь. То же самое, что:
def f():
return 5
только в одну строку. И вот в чём соль: в which_is_larger передают сами функции, а не их результаты. Чтобы достать числа, функции надо вызвать — дописать скобки:
def which_is_larger(f, g):
a = f() # вызвали первую → получили число
b = g() # вызвали вторую → получили число
if a is None or b is None:
return "neither" # сравнивать нечего
if a > b:
return "f"
if b > a:
return "g"
return "neither" # равны
Всё: два числа, три ветки if. (Если захочешь ловить вообще любой случай «сравнить нельзя» — оборачивают сравнение в try/except TypeError, но пока хватит и этого.)
Как подступаться к таким задачам:
- Раздели условие на «что дали» и «что вернуть». Тут: дали — две функции; вернуть —
"f"/"g"/"neither". - Реши руками на первом примере: f даёт 5, g даёт 10 →
"g". Ответ уже есть, осталось повторить кодом. - Пиши по одному действию и подсматривай
print(a, b)— видно, что реально лежит в переменных.
И про «что делаю не так»: скорее всего, дело не в способностях, а в том, что 20 курсов — это много чужих решений и мало своих ошибок. «Решать сложное» растёт не с нового курса, а когда сам застреваешь и дебажишь. И не путай «не понимаю Python» с «не понимаю математику» — это разные мышцы, и здесь работает первая.
Бери задачи чуть выше «лёгких и средних» — рост живёт там, где неуютно. 🐣
Тут нужно просто продолжать, нет никаких секретов. Это как кататься на велосипеде, ты пытаешься, и ты даже не понимаешь что именно не так, и почему не получается, что делать. Но это процесс интуитивный. В какой-то момент ты просто вдруг начинаешь это делать.
Добавлю с другой стороны, раз ты уточнил про математику и рекурсию.
Сразу про рекурсию: в which_is_larger её нет и не надо. Решение линейное, сверху вниз — никакая функция не вызывает сама себя. Весь фокус в одной мысли: функция — это тоже значение, которое можно передать, как запечатанную коробку. lambda: 5 — коробка, внутри которой лежит 5; пока не откроешь её скобками (), там «функция», а не число.
Поэтому первым делом коробки открывают:
def which_is_larger(f, g):
x = f() # открыли первую коробку → 5
y = g() # открыли вторую → 10
print(x, y) # вставь это и увидишь реальные числа
if x is None or y is None:
return "neither"
if x > y:
return "f"
if y > x:
return "g"
return "neither"
Этот print — твой лучший друг: когда «ничего не понятно», добавь его и посмотри, что реально лежит в переменных. Половина «непонятных» задач разъясняется именно здесь.
Теперь про математику — вижу, это твоя главная тревога, и она напрасна. «Сложная задача» почти никогда не равно «сложная математика». Чаще трудность в том, чтобы прочитать условие и разбить его на маленькие шаги, а не в формулах. А настоящая математика в коде — узкий кусок (проценты, остаток от деления, немного геометрии), который берут по мере надобности, а не учат весь учебник заранее. «Не решу, если встретится» — это нормально: тогда и разберёшь ровно ту тему, не раньше и не всю сразу.
И один приём, который реально двигает: прежде чем писать код, запиши словами ответ на конкретном примере. f()=5, g()=10 → "g". Ты уже знаешь результат — осталось объяснить его коду. Вот это и есть «умение решать сложное»: не гениальность, а привычка дробить задачу на кусочки, которые ты уже умеешь.