

Python3で質問です。  
f(0)=1, f(1)=1, f(n)=f(n-1)+f(n-2), n>1と言う条件でnが1から20までの再帰を行いたいのですが

[code]

    def f(n):
        if n == 0 or n == 1:
            return 1
        else:
            return f(n-1)+f(n-2)
    def main():
        for i in range(11):
            print(f(i))
    main()
    
[/code]

帰ってくる値は  
1  
1  
2  
3  
5  
8  
13  
21  
34  
55  
89

もともとのコードはこうなのですが、これをreturn時にlistに入れてreturnしたいのですがうまくいきません

[code]

    def f(n):
        L = []
        ans = []
        if n == 0 or n == 1:
            ans = 1
            L.append(ans)
            return L
        else:
            ans = f(n-1)+f(n-2)
            L.append(ans)
            return L
    def main():
        for i in range(11):
            print(f(i))
    main()
    
[/code]

このように書くと上のような値が帰ってきません。

どのようにすればlistに入れてreturnさせてもうまくいきますか？  
お知恵を貸してください


CC BY-SA 3.0
2018-01-12T12:50:54.587
40917
2018-01-16T09:28:30.283
26973
question
python python3
listをreturnさせるのがうまくいきません。


わざわざ関数1つでやる必要はありますか？

[code]

    def g(n):
      if n == 0 or n == 1:
        return 1
      else:
        return g(n-1)+g(n-2)
    
    def f(n):
      l = []
      for i in range(n):
        l.append(g(i))
      return l
    
    def main():
      print(f(11))
    
    main()
    
[/code]

このようにもう1つ関数を用意してしまうのがよいと思います。


CC BY-SA 3.0
2018-01-12T13:24:58.590
40918
2018-01-12T13:30:40.800
2018-01-12T13:30:40.800
9008
9008
40917
answer


別解として、以下の様に書いてみました。

[code]

    def f(n):
        if n == 0:
            return [1]
        elif n == 1:  
            return [1, 1]
        else:
            fn1 = f(n-1)
            return fn1 + [fn1[-1] + fn1[-2]]
    
    def main():
        for i in range(11):
            print("f({0}) = {1}".format(i, f(i)))
    
    main()
    
[/code]


CC BY-SA 3.0
2018-01-12T15:15:37.617
40919
2018-01-12T15:15:37.617
40917
answer


他の方と違うのも出来ました。もっとシンプルなのもありそうですかね。

[code]

    def f(n):
        if n == 0 or n == 1:
            return [1]
        else:
            return [sum(f(n-1)) + sum(f(n-2))]
    def fibonacci():
        result = []
        for i in range(11):
            result.append(f(i)[0])
        print(result)
    fibonacci()
    
[/code]

後は漸化式を解いてビネの公式を使う

[code]

    from math import sqrt
    def Fibonacci(n):
        if n == 0 or n == 1:
            return [1]
        else:
            return Fibonacci(n-1) + [(((1+sqrt(5))/2)**n-((1-sqrt(5))/2)**n)/(sqrt(5))]
    def result():
        for i in range(1,12):
            print(Fibonacci(i))
    result()  
    
[/code]

少し誤差が出ますが、

[code]

    [1, 1.0]
    [1, 1.0, 2.0]
    [1, 1.0, 2.0, 3.0000000000000004]
    [1, 1.0, 2.0, 3.0000000000000004, 5.000000000000001]
    [1, 1.0, 2.0, 3.0000000000000004, 5.000000000000001, 8.000000000000002]
    [1, 1.0, 2.0, 3.0000000000000004, 5.000000000000001, 8.000000000000002, 13.000000000000002]
    [1, 1.0, 2.0, 3.0000000000000004, 5.000000000000001, 8.000000000000002, 13.000000000000002, 21.000000000000004]
    [1, 1.0, 2.0, 3.0000000000000004, 5.000000000000001, 8.000000000000002, 13.000000000000002, 21.000000000000004, 34.00000000000001]
    [1, 1.0, 2.0, 3.0000000000000004, 5.000000000000001, 8.000000000000002, 13.000000000000002, 21.000000000000004, 34.00000000000001, 55.000000000000014]
    [1, 1.0, 2.0, 3.0000000000000004, 5.000000000000001, 8.000000000000002, 13.000000000000002, 21.000000000000004, 34.00000000000001, 55.000000000000014, 89.00000000000003]
    
[/code]


CC BY-SA 3.0
2018-01-12T15:46:06.123
40920
2018-01-13T00:21:43.293
2018-01-13T00:21:43.293
25766
25766
40917
answer