← Все вопросы

Как научиться решать сложные задачи?

Задан 2 месяца назад78 просмотров3 ответа
0

Я 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 ответа

1

Привет! Три года кода и пять своих игр — программировать ты умеешь. В этой задаче тебя сбила не сложность, а формулировка: математики здесь ноль, нужно просто сравнить два числа.

Про 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, но пока хватит и этого.)

Как подступаться к таким задачам:

  1. Раздели условие на «что дали» и «что вернуть». Тут: дали — две функции; вернуть — "f"/"g"/"neither".
  2. Реши руками на первом примере: f даёт 5, g даёт 10 → "g". Ответ уже есть, осталось повторить кодом.
  3. Пиши по одному действию и подсматривай print(a, b) — видно, что реально лежит в переменных.

И про «что делаю не так»: скорее всего, дело не в способностях, а в том, что 20 курсов — это много чужих решений и мало своих ошибок. «Решать сложное» растёт не с нового курса, а когда сам застреваешь и дебажишь. И не путай «не понимаю Python» с «не понимаю математику» — это разные мышцы, и здесь работает первая.

Бери задачи чуть выше «лёгких и средних» — рост живёт там, где неуютно. 🐣

Andromeda Galaxy Я про математику имел ввиду, если встретится не решу, а не про задачу · 2 месяца назад
Максим Герасимов Про математику вообще — она и школьная математика в программировании разные вещи. Для большинства задач (веб, приложения, боты, автоматизация, игровая логика) хватает арифметики и логики, формулы из учебника почти не нужны. Если попадётся что-то «математическое», фокус не в том, чтобы помнить всю математику, а в том, чтобы разбить задачу на шаги и найти нужную формулу под конкретный случай — сильные разработчики тоже постоянно гуглят формулы, это норма. Закрывать всю математику разом смысла нет: подтягивай ровно то, что реально встречается — проценты, остаток от деления, немного геометрии. «Не решу, если встретится» — не приговор, а повод разобрать именно эту тему, когда до неё дойдёшь. · 2 месяца назад
0

Тут нужно просто продолжать, нет никаких секретов. Это как кататься на велосипеде, ты пытаешься, и ты даже не понимаешь что именно не так, и почему не получается, что делать. Но это процесс интуитивный. В какой-то момент ты просто вдруг начинаешь это делать.

Эрнест Кратко можно ответить так: > `lambda` — это просто способ быстро создать небольшую анонимную функцию без `def`. Она работает как обычная функция: её можно передавать в другие функции, сохранять в переменные и вызывать. > > Например: > ```python > lambda: 5 > ``` > — это то же самое, что > ```python > def f(): > return 5 > ``` > > В данной задаче `lambda: 5` и `lambda: 10` — это две функции, которые при вызове (`f()` и `g()`) возвращают числа 5 и 10. Задача сводится к тому, чтобы вызвать обе функции, сравнить результаты и вернуть `"f"`, `"g"` или `"neither"`. · 2 месяца назад
Andromeda Galaxy Я знал, что на то, чтобы определить, что вывело в результате функция, можно только вне функции, а остальное рекурсия · 2 месяца назад
Эрнест Рекурсия тут вообще ни при чём, всё проще, чем кажется. Достаточно вызвать обе функции, получить два числа и сравнить их обычным if. lambda просто «упаковала» число в функцию, а f() и g() достают его обратно — три ветки сравнения, и готово. Рекурсия это когда функция вызывает сама себя, а здесь такого нет, так что можно не переживать. · 2 месяца назад
0

Добавлю с другой стороны, раз ты уточнил про математику и рекурсию.

Сразу про рекурсию: в 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". Ты уже знаешь результат — осталось объяснить его коду. Вот это и есть «умение решать сложное»: не гениальность, а привычка дробить задачу на кусочки, которые ты уже умеешь.

Ваш ответ

, чтобы ответить на вопрос.