寻找边缘案例进行测试

时间:2020-03-02 23:01:46

标签: python testing

我正在尝试通过以下步骤找到达到“ 1”所需的最少步数:

对于每个步骤,我可以执行以下步骤之一:

  1. 我可以添加“ 1”
  2. 我可以减去“ 1”
  3. 我可以除以“ 2”

该函数将被传递一个代表正整数的字符串。我的功能似乎可以正常工作,但在某些极端情况下我却失败了,但是我不确定如何找到会导致故障的极端情况。

n = int(n)
count = 0

while n > 1:
    if int(n) & int(n-1) == 0:
        count += len(str(bin(n))) - 3
        break
    if n % 2 == 0:
        n /= 2
    else:
        if (n - 1) % 4 == 0:
            n -= 1
        else:
            n += 1
    count += 1
return count

以下是通过测试的几个示例:

输入:solution.solution('15') 输出:5 (15-> 16-> 8-> 4-> 2-> 1)

输入:solution.solution('4') 输出:2 (4-> 2-> 1)

1 个答案:

答案 0 :(得分:0)

只需编写一个简单的解决方案,然后比较一堆输入的结果。

def elliott(n):
    n = int(n)
    count = 0

    while n > 1:
        if int(n) & int(n-1) == 0:
            count += len(str(bin(n))) - 3
            break
        if n % 2 == 0:
            n //= 2
        else:
            if (n - 1) % 4 == 0:
                n -= 1
            else:
                n += 1
        count += 1
    return count

def naive(n):
    reached = {int(n)}
    steps = 0
    while 1 not in reached:
        for x in reached.copy():
            reached |= {x - 1, x + 1}
            if x % 2 == 0:
                reached.add(x // 2)
        steps += 1
    return steps

for n in range(1, 20):
    x, y = elliott(n), naive(n)
    if x != y:
        print(n, x, y)

输出:

3 3 2
6 4 3
11 6 5
12 5 4
13 6 5