2016-09-09 10 views
2

私はPython関数を作成する必要があります。この関数はフィボナッチ値を再帰的にリストに格納し、そのリストを私に返します。それから、そのリストを印刷することができます。ここに私が持っているものがあります。リストに値を格納できるようにするにはどうしたらいいですか?

def recFib(x): 
    result = [] 

    if x == 1: 
     return result.append(1) 

    if x == 2: 
     return result.append(2) 

    for i in range(2,x): 
     result.append(recFib(i-1)+recFib(i-2)) 

    return result 

概念の多くは私に新しいですし、私は私が間違ってやっているかを把握することができないように見えるので、私は、Pythonのに新しいです。例えば、あなたのコードで

+0

値は結果に追加されるとしますか?それはあなたが別のリスト "古い"に追加しているようだ、または何かが欠けている。 – BigMonkey89WithaLeg

+0

私はお詫び申し上げます。私はそれを修正しました –

答えて

0

ありますいくつかの問題、:

return result.append(1)

None、それに追加1でないresultを返します。また

def recFib(x): 
    result = [] 

[]recFibが呼び出されるたびに結果セットします、私はそれはあなたが望んでいたものだとは思いません。

あなたのロジック全体を理解しているかどうかはわかりません。

可能な解決策は、このようなものです:

def recFib(x): 
    n_to_fib = {0: 0, 1: 1} 
    def fib(x): 
     if x in n_to_fib: 
      return n_to_fib[x] 
     temp = fib(x - 1) + fib(x - 2) 
     n_to_fib[x] = temp 
     return temp 

    return fib(x) 

if __name__ == "__main__": 
    result = [recFib(i) for i in range(8)] 

    print result 

結果:

[0, 1, 1, 2, 3, 5, 8, 13] 

、新しい値を計算することは、以前の値がn_to_fib辞書に格納されているため、高速であり、したがって、する必要はありません再計算する。

我々はまた、直接のリストを返すようにrecFibを変更することができます。

fib(x) 
return sorted(n_to_fib.values()) 

の代わり:ここ

return fib(x) 
+0

この関数はうまくいきますが、recFib関数はそのリストのn番目の要素の代わりにn個の要素のリストを返さなければなりません。 –

+0

@FrankBessou、私はそれがかなり単純な変更、例えば 'sorted(n_to_fib.values()) 'を返すことで達成できると思います。 – Akavall

+0

私には役に立たなかった –

1

は@ Akavallのanwer

def recFib(x): 
    fibArray = [0, 1] 
    def fib(x): 
     if x < len(fibArray): 
      return fibArray[x] 
     temp = fib(x - 1) + fib(x - 2) 
     fibArray.append(temp) 
     return temp 

    return fib(x) 
+0

ああ、それは賢いです。 – Akavall

+0

私はそれを試してからrecFibに入れました: print(i)、リストを生成できませんでした –

+0

私は何が起こっているのか見ています。私は並べ替えを試みた(fibArray.values()) –

0

試しにベースのソリューションですこれは:

def recFib(n): 
    if n == 1: 
     return [0] 
    elif n == 2: 
     return [0, 1] 
    else: 
     a = recFib(n-1) 
     return a + [a[-1] + a[-2]] 

プログラム内のキーはここにある:ここで

return a + [a[-1] + b[-1]] 

a  # This gets the most recently created list, since it's `recFib(n-1)` 
+  # Append to the next list (but does not return `None`) 
[ a[-1] # Last value of `recFib(n-1)`, which is the previous value. 
+  # Add to 
a[-2]] # Second last value of `recFib(n-1)`, which is the second previous value. 

recFib(5)のためのブレークポイントです:

n = 3 
a[-1]: 1 
a[-2]: 0 
n = 4 
a[-1]: 1 
a[-2]: 1 
n = 5 
a[-1]: 2 
a[-2]: 1 
[0, 1, 1, 2, 3] 

それは2つの機能を必要としません。私は一種の不正行為としてそれを見つける:

再帰関数をループすることは非常に非効率的であるためのリストを生成
>>> recFib(20) 
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181] 
>>> recFib(10) 
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34] 
>>> recFib(19) 
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584] 

。関数を使用するたびにシーケンス全体を再計算します。

+0

魅力のように動作します! + [a [-1] + b [-1]]が返すものを –

+0

@coding_xenoで説明できますか?最近の編集をご覧ください。私もコードを再編集しました。 –

関連する問題