Fibonacci sequence

################################################################################
#Question:                                                                     #
#Each new term in the Fibonacci sequence is generated by adding                #
#the previous two terms. By starting with 1 and 2, the first 10 terms will be: #
#                                                                              #
#    1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...                                    #
#                                                                              #
#By considering the terms in the Fibonacci sequence whose values do not exceed #
#four million, find the sum of the even-valued terms                           #
#By IT05 2012-08-14
################################################################################


#one
s = [1,2]
while s[-1]<=4000000:
    s.append(s[-1]+s[-2])
print(sum([i for i in s if i%2==0]))

#two
b = [3,5]
s = [2]
while s[-1]<=4000000:
    s.append(sum(b))
    b = [b[1]+s[-1],b[1]+s[-1]+s[-1]]
s.pop()
print(sum(s))

for i in s:
    if i%2==1:
        s.remove(i)
        print('remove:'+str(i))

一开始是想把结果里面的不合要求的数踢出,

于是用这段代码,然后想通过直接执行

print(sum(s))

即可获得所需结果,但是问题就出现了.(先不探讨,这种方法吃力不讨好)
因为在remove()的过程中会导致s元组发生改变,这样的话,由于for一开
始是假定元组s是不变的,它是通过类似的索引来读取元组的,虽然这个我
没有查到资料,但是我在测试中有这种规律,比如执行如下代码:

s = [1,2]
while s[-1]<=4000000:
    s.append(s[-1]+s[-2])
print(s)
#循环1
for i in s:
    if i%2==1:
        s.remove(i)
print(s)
#循环2
for i in s:
    if i%2==1:
        s.remove(i)
print(s)

最后的结果是:
[1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987,...]
[2, 5, 8, 21, 34, 89, 144, 377, 610, 1597, 2584, 6765, 10946,...]
[2, 8, 34, 144, 610, 2584, 10946, 46368, 196418, 832040, 3524578]
假定上面三行分别命名为A,B,C行
那么在循环1执行时,第一次循环发现1%2不为1,所以把1踢掉,如此是s=[2,3,...],
即s[0]=2,在执行第二次循环时,相当于执行索引1,即此时i=s[1],要是s没变的话,
很好,s[1]还是2,但是现在变了,变成了3,所以此时会把s[1]踢掉,所以s=[2,5,8,....]
执行第三次循环时,相当于索引2,即i=s[2],由于s[2]=8,s所以不作处理,但是我们
回过头却发现那个5因为偷偷地跑到前面去了,导致循环执行完之后,5被漏掉了。


后来回头想了下,其实没必要这么做的,直接把符合要求的提出来即可!


转载于:https://www.cnblogs.com/arbboter/archive/2012/08/14/4225238.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值