给定数字和比率,如何创建指数增长的数字列表,其总和等于起始数字?
>>> 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
答案 0 :(得分:4)
指数增长数的离散序列称为几何级数。总和称为几何系列。公式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的原始问题都可以使用二分搜索/二分法来解决。
答案 1 :(得分:3)
选择您想要的任何Fibonacci数字序列。将它们相加,然后将目标数除以总和以获得比例因子。通过缩放因子将所选序列中的每个数字相乘,并且您将有一个与您的目标相加的新序列,并且具有与斐波那契数字的原始序列相同的相邻项的比率。
要在您的问题中生成示例,请注意1 + 2 + 3 + 5 + 8 = 19和2.28 / 19 = 0.12。
答案 2 :(得分:2)
Fibonacci序列如下:0,1,1,2,3,5,8,13,21,34 ...等。正如您在问题的评论中已经看到的那样,Fibonacci序列本身并没有规模和#34; (即,fib_seq * 0.12 = 0, 0.12, 0.12, 0.24, 0.36, 0.60, 0.96 ... etc.
不再是Fibonacci序列),所以你真的只能按照上面给出的值的顺序制作斐波那契数列。如果您想根据某些标准使Fibonacci序列动态扩展,请进一步说明服务的目的和遇到的问题,以便社区可以为您提供更多帮助。
现在,让我们从基础开始。如果您在实现首先打印Fibonacci序列的函数时遇到问题,请参阅@andrea-ambu给出的答案:https://stackoverflow.com/a/499245/5209610。他提供了一个非常全面的解释,说明如何不仅在任何给定语言的函数中实现Fibonacci序列,而且还要进一步探索如何有效地执行此操作!
我认为你试图弄清楚如何编写一个函数,该函数将采用用户提供的整数并打印出总和为该值的斐波那契数列(即print_fib_series(33)
将打印{{1 }})。只需逐步添加Fibonacci系列中的下一个值,直到达到用户提供的值(并跟踪到目前为止总结的值),这是相当容易实现的,假设用户提供的值是斐波那契数列的总和。这是我刚才描述的一个简单实现:
0 + 1 + 1 + 2 + 3 + 5 + 8 + 13
因此,考虑到2.4的十进制值,您可以对Fibonacci系列应用0.12的线性比例因子,并获得您在问题中指出的结果。我希望这会帮助你!
答案 3 :(得分:0)
忘记十进制数字,就像julienc提到的那样,如果你弯曲Fibonacci系列的定义,那么程序就永远不知道从哪里开始#39;喜欢你想要的方式。你必须在这里确定斐波那契系列。
对于斐波那契数列的整数和实际定义,你最好做的是制作一个以数字为输入的程序,并告诉数字是否与某些斐波那契数列相加。如果确实如此,则打印该系列。假设这就是你想要的。
a = 33
f_list = []
def recur_fibo(n):
if n <= 1:
return n
else:
return(recur_fibo(n-1) + recur_fibo(n-2))
i=0
total = 0
while True:
num = recur_fibo(i)
total += num
f_list.append(num)
if total > a:
print "Number can not generate fibonacci series"
break
elif total == a:
print "Series: %s" % f_list
break
i +=1
输出:
Series: [0, 1, 1, 2, 3, 5, 8, 13]
答案 4 :(得分:0)
根据Alex Hall的回答,这就是我最终使用的内容:
def geoProgress(n, r=(1 + 5 ** 0.5) / 2, size=5):
""" Creates a Geometric Progression with the Geometric sum of <n>
>>> l = geoProgress(42)
>>> l
[2.5725461188664465, 4.162467057952537, 6.735013176818984,
10.897480234771521, 17.63249341159051]
>>> sum(l)
42.0
>>> l[-1]/l[-2]
1.6180339887498953
"""
return [(n * (1 - r) / (1 - r ** size)) * r ** i for i in range(size)]