python中指数增长的数字序列

2024-10-03 06:27:22 发布

您现在位置:Python中文网/ 问答频道 /正文

给定一个数字和一个比率,如何创建一个指数增长的数字列表,其和等于起始数字?在

>>> r = (1 + 5 ** 0.5) / 2
>>> l = makeSeq(42, r)
>>> l
[2.5725461188664465, 4.162467057952537, 6.735013176818984,
10.897480234771521, 17.63249341159051]
>>> sum(l)
42.0
>>> l[-1]/l[-2]
1.6180339887498953
>>> r
1.618033988749895

Tags: 列表数字指数比率summakeseq
3条回答

选择任何你想要的斐波纳契数列。把它们加起来,用你的目标数除以和得到一个比例因子。将所选序列中的每个数字乘以比例因子,就得到了一个新的序列,该序列和目标序列的总和相同,并且相邻项的比率与原始的Fibonacci数序列相同。在

要生成问题中的示例,请注意1+2+3+5+8=19,2.28/19=0.12。在

斐波纳契序列如下:0,1,1,2,3,5,8,13,21,34。。。等等,正如你可能已经在你的问题的评论中看到的那样,斐波那契序列本身并不“缩放”(也就是说,fib_seq * 0.12 = 0, 0.12, 0.12, 0.24, 0.36, 0.60, 0.96 ... etc.不再是斐波那契序列),所以你实际上只能按照上面给出的值的顺序来做一个斐波那契数列。如果您想根据某些标准使Fibonacci序列具有动态可伸缩性,请进一步说明它的用途以及您遇到的问题,以便社区能够为您提供更多帮助。在

现在,让我们从基础知识开始。如果您在实现一个函数来打印Fibonacci序列时遇到了困难,请参考@andrea ambu在这里给出的答案:https://stackoverflow.com/a/499245/5209610。他提供了一个非常全面的解释,不仅是如何在任何给定语言的函数中实现Fibonacci序列,而且还进一步探讨了如何有效地实现这一点!在

我假设您正在尝试如何编写一个函数,该函数将使用用户提供的整数并打印出总和为该值的Fibonacci系列(即,print_fib_series(33)将打印0 + 1 + 1 + 2 + 3 + 5 + 8 + 13)。假设用户提供的值是Fibonacci系列值的总和,则只需递增地将Fibonacci系列中的下一个值相加,直到达到用户提供的值为止(并跟踪到目前为止您已将哪些值相加),就可以很容易地实现这一点。下面是我刚刚描述的简单实现:

# Recursive implementation of the Fibonacci sequence from the answer I linked
def fib_seq(ind):
    if ind == 0: 
        return 0;
    elif ind == 1: 
        return 1;
    else: 
        return fib_seq(ind - 1) + fib_seq(ind - 2);

def list_fib_series(fib_sum, scaling_factor):
    output_list = [];
    current_sum = 0;
    for current_val in fib_seq():
        current_sum += current_val * scaling_factor;
        output_list.append(current_val);
        if current_sum == fib_sum:
            return output_list;
        elif current_sum > fib_sum: 
            return 0; # Or you could raise an exception...


fib_list = list_fib_series(2.4, 0.12):
print ' + '.join(map(str, fib_list));

因此,考虑到2.4的十进制值,您可以对Fibonacci级数应用0.12的线性比例因子,得到您在问题中指出的结果。我希望这对你有帮助!在

指数增长的离散序列称为几何级数。这个和叫做几何级数。公式here可以很容易地求解,以产生您需要的序列:

>>> n = 5
>>> r = (1 + 5 ** 0.5) / 2
>>> r
1.618033988749895
>>> total = 2.28
>>> a = total * (1 - r) / (1 - r ** n)
>>> a
0.13965250359560707
>>> sequence = [a * r ** i for i in range(n)]
>>> sequence
[0.13965250359560707, 0.22596249743170915, 0.36561500102731626, 0.5915774984590254, 0.9571924994863418]
>>> sum(sequence)
2.28
>>> sequence[1] / sequence[0]
1.618033988749895
>>> sequence[2] / sequence[1]
1.618033988749895
>>> sequence[2] / sequence[1] == r
True

同样值得注意的是,这个问题和Fibonacci的原始问题都可以用二进制搜索/对分方法来解决。在

相关问题 更多 >