0

该程序的目标是让函数“Fib”接收两个值,并将它们放入一个斐波那契数列,在变量“sequence”中添加项。当它通过'check'函数并返回Limit Reached时,它会将偶数添加到列表'final'中,然后循环打印出'final'的总和。

问题是,无论 Fib 采用什么值,'final' 总是以没有值结束。我对编程很陌生,似乎无法弄清楚为什么要这样做......

def even(x):
    v = list(str(x))[-1]
    if v == '0' or v == '2' or v == '4' or v == '6' or v == '8':
        return x
    else:
        return 0 
def check(sequence):
    for v in sequence:
        if v >= 20:
            return 'Limit Reached'
        else:
            return None

def Fib(x,y):
    sequence = [x,y]
    a = 0
    b = 1
    final = []
    while len(sequence) < 100:
        term = sequence[a] + sequence[b]
        sequence.append(term)
        if check(sequence) == 'Limit Reached':
            for v in sequence:
                final.apppend(even(v))
            print sum(final)
            break
        a += 1
        b += 1
4

5 回答 5

4

checkNone如果列表中的第一项小于 20,将始终返回。

你可能的意思是:

def check(sequence):
    for v in sequence:
        if v >= 20:
            return 'Limit Reached'
    else:
        return None
于 2012-07-09T21:28:40.157 回答
2

这段代码有很多问题。我会这样写:

def even(x):
    # is the modulo operator, it's used to calculate a remainder
    return x % 2 == 0

def check(sequence):
    # you need to check all the values, not just the first one
    return max(sequence) >= 20

def Fib(x, y):
    sequence = [x, y]

    while len(sequence) < 100:
        # it's not necessary to keep a and b around, you can use 
        # negative indices instead
        sequence.append(sequence[-2] + sequence[-1])

        if check(sequence):
            # this is called a "generator comprehension"
            print sum(v for v in sequence if even(v))
            break

仍然可以进一步简化,但是这种结构与您自己的结构相匹配。实际上甚至没有必要保留sequence,因为您可以随时保持运行总计,但我认为以这种方式完成它会更有启发性。

于 2012-07-09T21:37:18.563 回答
1

你没有返回 final,所以每次调用 Fib() 时它的值都会被清除,因为它是一个局部变量。我确定它会打印出预期的结果,不是吗?

于 2012-07-09T21:28:23.720 回答
0

也许你想要更简单的东西:

def fib(a, b, iterations = 20):
    result = 0
    if not (a & 1): result += a
    if not (b & 1): result += b
    for x in xrange(iterations):
        nextval = a + b
        if not (nextval & 1):
            result += nextval
        a = b
        b = nextval
    return result
于 2012-07-09T21:38:38.740 回答
0

与大多数语言不同,Python 会在这样的错字上引发运行时错误(而不是根本不编译您的程序)。

 final.apppend(even(v))

没有看到运行时错误表明if永远不会满足周围条件,这是因为该check方法在检查序列中的第一项后立即返回,而不是检查整个序列。

于 2012-07-09T21:31:59.000 回答