0

我是 Python 语言的新手,我遇到了这个问题,下面的代码没有返回预期值:

def rabbits(n):
    first = 1
    second = 1

    if n == 1 or n == 2:
        return 1
    while n > 2:
        first, second = second, first + second
        n -= 1

    if n > 5:
        die1 = 1
        die2 = 1
        if n == 6 or n == 7:
            return second - 1
        while n > 7:
            die1, die2 = die2, die1 + die2
            n -= 1
        return second - die2
    return second

我希望 rabbits(6) 会返回 7,但它会返回 8。谁能帮我在这里找到错误的东西?谢谢!

4

4 回答 4

8

我认为按照所述解决您的问题没有用。

但这里有一些关于调试这类问题的建议,它更有用:

在程序的每个阶段打印出你的价值观

然后,您可以在脑海中以您的价值观逐步完成该程序,并找出问题所在。

于 2012-08-21T14:39:32.247 回答
4

您首先减少n到 2 或更低 ( while n > 2: .. n -= 1),然后测试是否n > 5

后一个测试永远不会通过,因为n现在总是 2 或更低。

第一次归约计算斐波那契数列,该数列中的第 6 个值是 8(在 1、1、2、3 和 5 之后)。

为避免您的问题,请改用简单的范围循环:

for i in range(n, 2, -1):
    first, second = second, first + second

现在i将从 6 变为 3 而不会更改n

于 2012-08-21T14:39:22.993 回答
3

据我所知,它永远不会返回 7。您正在计算斐波那契数列。它的前几个术语是 1,1,2,3,5,8,13。没有7。

斐波那契数列从 1,1 开始,然后每个下一项计算为前两项之和。这正是您对first, second = second, first + second语句所做的。因此rabbits(n) <=> fibonacci(n)

if n > 5由于分支内的代码,您可能会期待 7 。while n > 2但是,该分支永远不会被执行,因为由于它之前的循环,n 将始终小于或等于 2 。

于 2012-08-21T14:40:02.083 回答
0

您正在更改while n > 2语句中的 n、使用变量的副本或以更好的方式实现它。

def rabbits(n):
    first = 1
    second = 1

    if n == 1 or n == 2:
        return 1
    m = n
    while m > 2:
        first, second = second, first + second
        m -= 1

    if n > 5:
        die1 = 1
        die2 = 1
        if n == 6 or n == 7:
            return second - 1
        while n > 7:
            die1, die2 = die2, die1 + die2
            n -= 1
        return second - die2
    return second
于 2012-08-21T14:41:13.847 回答