检查一个数字是否可以被Python中的递归与其他数字整除

时间:2013-11-10 03:30:13

标签: python

冒着获得反对票的风险,我将在前言中说这是编程课的中期问题。但是,我已经提交了代码并通过了问题。我更改了函数的名称,以便有人不能立即进行搜索并找到正确的代码,因为这不是我的目的。我实际上是想从我写的两件作品中找出实际上更正确的东西。

问题告诉我们,某个快餐店以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实际上是假的:

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作为初始输入进行测试,您认为哪个函数能提供正确的答案?

2 个答案:

答案 0 :(得分:1)

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

  • 没有理由让零特殊。
  • 每个可被6整除的数字应该是真的(零可以被6整除),同样适用于9和20。
  • 如果问题只是“当我可以购买的唯一包装是六,九和二十这个时,可以实现零件的结果”那么答案仍然是肯定的(只是不买任何东西);这是我能想到的这个功能的实际用例最接近的。
  • 第一个功能的简单实现表明更优雅。
  • 如果你用更算术的方式陈述问题,那么它最容易被称为“给定n,是否存在自然#'si,j,k,st n = 6i + 9j + 20k”并且在该公式中答案是明确无误的对于n = 0。
  • 如果你将上面的内容扩展为整数i,j,k,那么你也应该为-6,+ 6,-9,-15,+ 15赋予真,所以也是零。如果你返回false为零,那么许多漂亮的漂亮属性(如果f(n)为真,则f(n)+/- 6为真)也会中断,这可以说明我的第三点。

答案 1 :(得分:-1)

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