Понимание кода, лежащего в основе gridtraveller

#python #grid #definition #function-definition

Вопрос:

Я нашел базовый код на python,чтобы найти количество путей, которые вы можете выбрать в сетке (m, n), если вы можете идти только вниз или вправо.

  def gridtraveller(m,n):
    if m == 0 or n == 0:
        return 0
    elif m == 1 or n == 1:
        return 1
    return gridtraveller(m-1,n)   gridtraveller(m,n-1)
 

Но я не понимаю, почему это работает для двух вещей:
Что делает def something (m,n)?
И почему здесь мы возвращаем определение ? ( Я понимаю , почему мы возвращаем
m-1 и n-1, но я не понимаю концепции def, возвращающей def)

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

Комментарии:

1. def является ключевым словом python для определения объекта функции: def func(): определяет, что func делает вызов, func является объектом функции и func() вызывает эту функцию. функция, которую вы описываете, использует рекурсию (если она заходит так далеко), она просто снова вызывает эту функцию внутри функции, а затем может вызывать ее снова, пока она либо не достигнет максимальной глубины рекурсии, либо не вернет какое-то фактическое значение, когда она просто вернется к лестнице функций и все это подытожит

2. Я предлагаю вам ознакомиться с некоторыми базовыми учебными пособиями (такими как эти, написанные Кори Шафером ), в частности, с этим (по теме): Учебник по Python для начинающих 8: Функции , также речь идет о рекурсии и поиске других источников, если вам нужно лучше понять это

3. Благодаря тебе я пойду посмотрю прямо сейчас

Ответ №1:

В Python def ключевое слово просто используется для определения функции, в данном случае это функция gridtraveller(m,n) . То, что вы видите с этим последним оператором return, на самом деле является функцией, возвращающей значение другой функции. В этом случае он возвращает значение другого вызова gridtraveller , но с другими значениями параметров; это называется рекурсией. Важной частью рекурсии является наличие соответствующих базовых вариантов или возвращаемых значений, которые не заканчиваются другим рекурсивным вызовом(т. Е. return 0 или return 1 , как вы видите).

Это может быть проще понять, просто пройдя несколько итераций рекурсивных вызовов. Если ваш первый вызов функции начинается с m = 2 и n = 1 , первый вызов закончится на return gridtraveller(1,1) gridtraveller(2,0) . Первый вызов в этом операторе затем вернется 1 , так как либо m или n есть 1 , а второй вернется 0 , так n = 0 как здесь дает общий результат 1 . Если используются большие значения m и n , это, очевидно, приведет к увеличению числа, так как произойдет больше вызовов gridtraver(m,n) .