2

冒着收到反对票的风险,我会先说这是一个编程课程的中期问题。但是,我已经提交了代码并通过了问题。我更改了函数的名称,以便有人无法立即进行搜索并找到正确的代码,因为这不是我的目的。我实际上是想从我写的两篇文章中弄清楚什么是更正确的。

问题告诉我们,某个快餐店出售一口大小的鸡肉,每包 6、9 和 20 个。它希望我们创建一个函数来判断给定数量的一口大小的鸡肉是否可以通过购买不同的包获得。例如,可以购买 15,因为 6 + 9 是 15,但不能购买 16,因为没有组合包等于 15。我提交并且“正确”的代码是:

def isDivisible(n):
    """
    n is an int

    Returns True if some integer combination of 6, 9 and 20 equals n
    Otherwise returns False.
    """
    a, b, c = 20, 9, 6
    if n == 0:
        return True

    elif n < 0:
        return False

    elif isDivisible(n - a) or isDivisible(n - b) or isDivisible(n - c):
        return True

    else:
        return False

但是,我开始思考,如果初始数字为 0,它将返回 True。初始数字 0 是否会被视为“使用 6、9 和/或 20 购买该数量”?我无法查看评分者使用的测试用例,所以我不知道评分者是否将 0 视为测试用例并确定 True 是否为可接受的答案。我也不能只输入新代码,因为它是期中考试。我决定创建第二段代码来处理初始情况 0,并假设 0 实际上是 False:

def isDivisible(n):
    """
    n is an int

    Returns True if some integer combination of 6, 9 and 20 equals n
    Otherwise returns False.
    """
    a, b, c = 20, 9, 6
    if n == 0:
        return False
    else:
        def helperDivisible(n):
            if n == 0:
                return True

            elif n < 0:
                return False

            elif helperDivisible(n - a) or helperDivisible(n - b) or helperDivisible(n - c):
                return True

            else:
                return False
        return helperDivisible(n)

如您所见,我的第二个功能必须使用“帮助”功能才能工作。不过,我的总体问题是,如果评分者测试了 0 作为初始输入,您认为哪个函数会提供正确答案?

4

2 回答 2

1

我认为第一个功能是正确的。

  • 没有理由让零特别。
  • 每个能被 6 整除的数字都应该为真(零能被 6 整除),同样适用于 9 和 20。
  • 如果问题只是“当我能买的唯一包是六包、九包和二十包时,能否实现零件的结果”,那么答案仍然是肯定的(只是什么都不买);这是我目前能想到的最接近此功能的实际用例。
  • 第一个函数的更简单的实现表明更优雅。
  • 如果你更用算术的方式陈述这个问题,它最容易表述为“给定 n,是否存在自然的#'si, j, k, st n = 6i + 9j + 20k”,并且在该公式中,答案对于 n= 是明确正确的0。
  • 如果将上述扩展到整数 i、j、k,那么对于 -6、+6、-9、-15、+15 以及零,您也应该给出 true。如果你返回 false 为零,那么很多漂亮的属性(如果 f(n) 为真,则 f(n) +/- 6 为真)也会中断,这与我的第三点有关。
于 2013-11-10T03:49:21.110 回答
-2

我的回答是第二个功能更正确,因为从技术上讲,初始数字 0 不能使用 6、9 和/或 20 包购买。

于 2013-11-10T03:30:13.253 回答