【问题标题】:How to recursively slice through a list and compare adjacent values如何递归地切片列表并比较相邻值
【发布时间】:2020-07-16 20:55:02
【问题描述】:

enter code here如果不提供解决方案,有人可以帮助我理解如何表示这种模式。我认为您需要检查是否第 n + 1 > 第 n 个值递归。由于这不是一个列表,我认为我需要使用模数和地板除法来遍历列表。但是,只有两个返回语句,我不知道如何递归调用该函数并返回 True 和 False。

问题陈述: 孔号是一个数字,其中每隔一个数字下降到紧邻它的数字之下。例如,数字 968 将被视为一个洞号,因为数字 6 小于其周围的两个数字。假设我们只传入奇数位数的数字。定义以下函数,以便正确识别孔号。

def check_hole_number(n):
    """
    >>> check_hole_number(123)
    False
    >>> check_hole_number(3241968)
    True
    >>> check_hole_number(3245968)
    False
    """
    if _________________________________________________________:
        return _________________________________________________________
    return ______________________________________________________________

我的解决方案:

def check_hole_number(n):
    if n // 10 == 0:
        return True
    return (n % 10) > (n // 10 % 10) and (n // 10 % 10) < (n // 100 % 10) \
    and check_hole_number(n // 100)

【问题讨论】:

    标签: python list recursion tree


    【解决方案1】:

    模式会是这样的:

    您必须在每一步检查当前号码的前 3 位:

    • 检查(在if 语句中)前3 个数字是否符合hole number 条件
    • 如果前 3 位符合 hole number 条件,则在当前步骤检查您是否有最后一个 3 数字:

      • 如果您有最后 3 位数字,那么您应该返回 True(您已经检查了所有其余数字,现在您确定该号码是 hole number
      • 如果您没有最后 3 位数字,您必须再次调用您的函数来检查下一位数字(您必须跳过前 2 位数字)
    • 如果当前的前 3 位不是hole number,则应返回False

    def check_hole_number(n):
        """
        >>> check_hole_number(123)
        False
        >>> check_hole_number(3241968)
        True
        >>> check_hole_number(3245968)
        False
        """
        if str(n)[1] < str(n)[0] and str(n)[1] < str(n)[2]:
            return True if len(str(n)) == 3 else check_hole_number(str(n)[2:])
    
        return False
    

    另外,您可以检查当前步骤的最后 3 位数字:

    def check_hole_number(n):
        """
        >>> check_hole_number(123)
        False
        >>> check_hole_number(3241968)
        True
        >>> check_hole_number(3245968)
        False
        """
        if n // 10 % 10 < n % 10 and  n // 10 % 10 <  n % 1000 // 100:
            return True if n < 1000 else check_hole_number(n // 100)
    
        return False
    

    【讨论】:

    • 是的,我认为如果条件不成立,但我的问题是使用我必须填充的三行代码来实现。不知何故,我需要表明我已经完成并返回 True。我认为基本情况是如果 n // 10 == 0: return True
    • @rocket_man 你可以看看实际的实现可能会有所帮助
    • 谢谢!是的,我错误地认为它是一个列表,所以我实现了一个使用索引的解决方案。您的解决方案与我使用 str 转换所做的相同。但是,一旦我弄清楚了基本情况,我就想出了如何递归地做到这一点。检查 OP。
    【解决方案2】:

    我在下面实现了一个示例,欢迎您查看以寻求帮助。如果您不想这样做,请按照以下提示操作:

    作为提示:

    1. 如果你使用递归,你总是需要一个终止条件,否则函数会无休止地调用自己,所以想想不应该使用什么输入再次调用函数。如果使用此输入调用您的函数(通过递归调用),只需返回一个值,一个布尔值,不要再次调用该函数。

    2. 您已经在正确的方式上定义递归的新函数调用,但它真的是 n[1:] 作为新输入吗?再想一想,用一个例子手动玩一遍这个函数。

    3. 何时需要另一个函数调用?或者换句话说:你什么时候可以确定输入n 不是孔号?设置这个条件,根据条件是真还是假设置函数调用。

    4. 一般提示:int 类型的变量在 Python 中不可下标,因此您始终必须将数字转换为 str,即字符串表示形式

    !剧透;-)! 一个示例实现(仅在假设下有效:inputNumber mod 2 != 0) 在这里能找到它: https://www.codepile.net/raw/NpoRbalV.py

    【讨论】:

    • 嘿 kederrac,我当然读过这个。我只是认为,对于所有其他用户来说,为所有需要它的人提供解决方案也是有意义的。对于所有其他人,第一句话表示可以忽略的解决方案。
    • 嘿kederrac,即使我有不同的意见,我已经相应地调整了答案。
    • 您的解决方案没有错,但我只有 3 行代码来编写代码。
    猜你喜欢
    • 1970-01-01
    • 2015-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    • 2020-07-09
    • 2022-01-08
    • 1970-01-01
    相关资源
    最近更新 更多