【问题标题】:Unexpected Python behaviour - function fails to terminate after return statement意外的 Python 行为 - 函数在 return 语句后无法终止
【发布时间】:2020-05-18 15:13:52
【问题描述】:

我写了一个函数来 traverseMountain(altitude, stepsleft, substring) 作为一个辅助函数来解决一个hackerrank问题。我认为在编写函数时测试它们是更好的做法,这就是我遇到问题的地方。

#!/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 没有在 return 语句之后终止函数。我已经使用了条件、return 语句的放置等,但没有成功。

【问题讨论】:

  • 你不需要那些图片;无论如何,它们是不可读的。问题是您没有从递归调用返回返回值。

标签: python python-3.x visual-studio-code tail-recursion


【解决方案1】:

您正在返回 x,但在您的递归调用中,您没有对返回值做任何事情。

您可能希望return traverseMountain(altitude, stepsleft,tail) 作为traverseMountain 中的最后一行?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-21
    • 2018-12-15
    • 2018-03-07
    • 2015-01-05
    • 2011-10-29
    • 2018-09-10
    • 2016-01-07
    • 2014-12-18
    相关资源
    最近更新 更多