Я немного заржавел, когда мой 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 *
Вот несколько скриншотов моей отладки кода, который я написал. Каждый снимок экрана был сделан с помощью одной команды «перешагнуть» с отладчиком.
Сегодня я потратил много времени, пытаясь понять, почему Python не завершает функцию после оператора return. Я поиграл с условными обозначениями, положением оператора return et c. но безуспешно.