Неожиданное поведение Python - функция не завершается после оператора return - PullRequest
0 голосов
/ 02 февраля 2020

Я немного заржавел, когда мой Python работал с Haskell и Прологом в течение последних 6 месяцев. Так что я задавал вопросы Хакерранка, чтобы попытаться обновить sh сам.

Я на windows машине, использую код Visual Studio. Среды, над которыми я обычно не работаю.

Я написал функцию для traverseMountain (altitude, stepsleft, substring) как вспомогательную функцию для решения одной из проблем хакерранка. Я считаю, что лучше проверять функции по мере их написания, и именно здесь я сталкиваюсь со своей проблемой. Я использовал отладчик кода Visual Studio для пошагового выполнения кода, который я написал, и вставил его ниже.

#!/bin/python3

import math
import os
import random
import re
import sys

# Complete the countingValleys function below.
def countingValleys(n, s):
    altitude = 0
    mountiansCount = 0
    valleysCount = 0
    def tailRecurseSolution(stepsleft, substring):
        head, tail = substring[0], substring[1:]
        if (head == 'U'):
            mountiansCount+=1
            traverseMountain(n-1, tail)
        if (head == 'D'):
            traverseValley(altitude+1, n-1, tail)


#    return valleysCount


def traverseMountain(altitude, stepsleft, substring):
    head, tail = substring[0], substring[1:]
    if (head=="D"):
         altitude-=1
    if (head=="U"):
         altitude+=1
    stepsleft-=1
    if (altitude<=0 or stepsleft<=0 or (not tail)):
        x = stepsleft
        return x
    elif (altitude>0 and stepsleft>0 and tail):
        traverseMountain(altitude, stepsleft,tail)


#def traverseValley(alt, stepsleft, substring):
#    return x

if __name__ == '__main__':
    altitude = 0
    stepsleft = 99
    path = "UUUDUDDD"
    print(traverseMountain(altitude, stepsleft, path))

Вы можете игнорировать функцию countingValleys как ее неполную и не вызываемую.

Я ожидал, что функция traverseMountian выполнит условное условие if и войдет в блок при последнем рекурсивном вызове (когда переменная высоты равна 0 или хвост является пустой строкой) и затем выйдет функция и возвращает значение переменной stepsLeft.

Что я наблюдаю, так это то, что мой отладчик шагает внутрь этого оператора if, но сразу переходит к внутреннему выражению elif (я не понимаю, почему он это сделал ) и переменные, которые я получаю, сбрасываются?

Я хотел бы написать здесь сообщение на случай, если это намечается поведение написанного мной кода, но меня просто ускользает от того, что я написал, однако это поведение в мой разум очень странный по сравнению с предыдущим опытом python казни. * 101 4 *

Вот несколько скриншотов моей отладки кода, который я написал. Каждый снимок экрана был сделан с помощью одной команды «перешагнуть» с отладчиком.

enter image description here enter image description here enter image description here enter image description here enter image description here enter image description here enter image description here enter image description here

Сегодня я потратил много времени, пытаясь понять, почему Python не завершает функцию после оператора return. Я поиграл с условными обозначениями, положением оператора return et c. но безуспешно.

1 Ответ

2 голосов
/ 02 февраля 2020

Вы возвращаете x, но в своем рекурсивном вызове вы ничего не делаете с возвращаемым значением.

Возможно, вы захотите return traverseMountain(altitude, stepsleft,tail) в качестве последней строки в traverseMountain?

...