numpy中的递归减法

时间:2015-01-13 00:31:43

标签: python numpy recursion scipy

考虑以下递归问题:假设我有total_units可以在total_days中使用的内容。在任何一天,当我花费这些单位时,我会留下units_left单位和days_left。基于此,我可以将ideal_daily_rate定义为units_left/days_left

现在,我们假设从第一天开始,我们选择每天20% ideal_daily_rate消费。请注意,在任何指定日期开始时,ideal_daily_rate 始终计算为units_left/days_left,我们只选择花费20%以上的ideal__daily_rate那一天。

目标是根据初始条件total_unitstotal_days和上述理想率[{1}},获取每天花费的单位数。

20%中是否有一个库可以帮助处理/矢量化这种类型的递归?

3 个答案:

答案 0 :(得分:2)

允许i = number of unitsN = total number of days。在接下来的几天之后剩下的单位数是

i1 = i0*(1-1.2/N)
i2 = i1*(1-1.2/(N-1)) = i0*(1-1.2/N)*(1-1.2/(N-1))
etc.

您可以使用以下方式在numpy中计算:

i = np.cumprod(1-1.2/np.arange(1,N+1)[::-1])*i0

答案 1 :(得分:2)

我不明白为什么这需要递归。这是一个简短的模拟,用于获取您描述的值。它本质上是一个衰减差分方程(微分方程的离散形式)。如果你认为我误解了某些事情,请纠正我。

days_left = 100
units_left = 50
ideal_daily_rate = units_left/days_left
spend = 1.2*ideal_daily_rate

while (days_left>0):
    print( "days_left: %4.1f unit_left: %4.1f ideal: %5.2f spend: %5.2f" % (days_left,units_left,ideal_daily_rate,spend))
    units_left -= spend
    days_left -= 1
    if (days_left>0):
        ideal_daily_rate = units_left/days_left
        spend = 1.2*ideal_daily_rate

答案 2 :(得分:1)

这是另一种方式

def tock(days,units,perc_more):

    loop = reversed(xrange(days+1)) #a little fanciness... 
                                    #probably not the best method

    for day in loop:
        if day == 0: break
        ideal_rate = units/day
        spend = ideal_rate * perc_more
        print(spend)
        units = units - spend

%timeit -n 10 tock(10,10,1.2)