-2

2つの数字が与えられるシナリオがあります。そして、私はそれらの平均/またはいくつかの機能をさまざまなレベルまで継続的に見つけてきました。

例えば:

Input I = 2, 64
I1=2, 33=f(2,64), 64
I1=2, 33, 64
I2=2, 17=f(2,33), 33, 49=f(33,64), 64 
I2=2,17,33,49,64
I3=2,9=f(2,17),17,25=f(17,33),33,41=f(33,49),49,57=f(49,64),64
I3=2,9,17,25,33,41,49,57,64

最初の反復では、関数 f(2,64) を適用して中間値 (この場合は 33) を見つけます。次に、結果の系列を書き出します。3 つの要素の長さになりました。次のパスでは、関数を (2,33) に適用して 17 を返し、(33,64) に適用して 49 を返します。– Floris からの編集ヘルプ

これを計算上効果的にコーディングするアルゴリズムはありますか?

4

1 に答える 1

1
from itertools import izip_longest

def apply_pairwise(lst, f, loops=1):
    if loops == 0:
        return lst
    new_lst = [f(a,b) for a,b in zip(lst, lst[1:])]
    next_lst = [e for t in izip_longest(lst, new_lst) for e in t if e]
    return apply_pairwise(next_lst, f, loops-1)

次に、2 つの値を取る任意のペアワイズ関数を使用するように指定できます。

>>> apply_pairwise([2, 64], lambda x,y: (x+y)/2.0, 3)
[2, 9.75, 17.5, 25.25, 33.0, 40.75, 48.5, 56.25, 64]
于 2013-05-22T06:45:20.383 に答える