• 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被漏掉了。


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


  • 相关阅读:
    jquery封装的时间轴
    openlayers实现多图显示
    wms常用操作
    教你如何拔取百度地图POI兴趣点
    北京市地铁线路及站点数据
    Arcgis for js实现北京地铁的展示
    Openlayers 2.X加载高德地图
    Arcgis for js加载百度地图
    常用公共服务接口与java调用实现
    Openlayers 2.X加载天地图
  • 原文地址:https://www.cnblogs.com/arbboter/p/4225238.html
Copyright © 2020-2023  润新知