<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
	<id>http://jca.jp/wiki/index.php?action=history&amp;feed=atom&amp;title=Python%E5%AE%9F%E8%A1%8C%E4%BE%8B_%E3%83%95%E3%82%A3%E3%83%9C%E3%83%8A%E3%83%83%E3%83%81%E6%95%B0</id>
	<title>Python実行例 フィボナッチ数 - 版の履歴</title>
	<link rel="self" type="application/atom+xml" href="http://jca.jp/wiki/index.php?action=history&amp;feed=atom&amp;title=Python%E5%AE%9F%E8%A1%8C%E4%BE%8B_%E3%83%95%E3%82%A3%E3%83%9C%E3%83%8A%E3%83%83%E3%83%81%E6%95%B0"/>
	<link rel="alternate" type="text/html" href="http://jca.jp/wiki/index.php?title=Python%E5%AE%9F%E8%A1%8C%E4%BE%8B_%E3%83%95%E3%82%A3%E3%83%9C%E3%83%8A%E3%83%83%E3%83%81%E6%95%B0&amp;action=history"/>
	<updated>2026-05-09T20:03:33Z</updated>
	<subtitle>このウィキのこのページに関する変更履歴</subtitle>
	<generator>MediaWiki 1.34.1</generator>
	<entry>
		<id>http://jca.jp/wiki/index.php?title=Python%E5%AE%9F%E8%A1%8C%E4%BE%8B_%E3%83%95%E3%82%A3%E3%83%9C%E3%83%8A%E3%83%83%E3%83%81%E6%95%B0&amp;diff=3226&amp;oldid=prev</id>
		<title>Taratta: ページの作成:「&lt;pre&gt; # フィボナッチ数 # F_0 = 0, F_1 = 1, F_n = F_{n-2} + F_{n-1} で定義される  def fibo1(n):     if (n == 0):         return 0     elif (n == 1):         r…」</title>
		<link rel="alternate" type="text/html" href="http://jca.jp/wiki/index.php?title=Python%E5%AE%9F%E8%A1%8C%E4%BE%8B_%E3%83%95%E3%82%A3%E3%83%9C%E3%83%8A%E3%83%83%E3%83%81%E6%95%B0&amp;diff=3226&amp;oldid=prev"/>
		<updated>2022-11-13T05:55:02Z</updated>

		<summary type="html">&lt;p&gt;ページの作成:「&amp;lt;pre&amp;gt; # フィボナッチ数 # F_0 = 0, F_1 = 1, F_n = F_{n-2} + F_{n-1} で定義される  def fibo1(n):     if (n == 0):         return 0     elif (n == 1):         r…」&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新規ページ&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
# フィボナッチ数&lt;br /&gt;
# F_0 = 0, F_1 = 1, F_n = F_{n-2} + F_{n-1} で定義される&lt;br /&gt;
&lt;br /&gt;
def fibo1(n):&lt;br /&gt;
    if (n == 0):&lt;br /&gt;
        return 0&lt;br /&gt;
    elif (n == 1):&lt;br /&gt;
        return 1&lt;br /&gt;
    else:&lt;br /&gt;
        return fibo1(n-2)+fibo1(n-1)&lt;br /&gt;
&lt;br /&gt;
# 自分自身を２回再帰呼び出ししているので、n が大きくなると&lt;br /&gt;
# かかる時間が指数関数的に増大する。&lt;br /&gt;
# fibo1(35)&lt;br /&gt;
# で答えが出るまでに 5 秒くらい。&lt;br /&gt;
# それより大きい数では飛躍的にかかる時間が長くなる。&lt;br /&gt;
&lt;br /&gt;
# フィボナッチ数(if 文と for 文を使って)&lt;br /&gt;
&lt;br /&gt;
def fibo2(n):&lt;br /&gt;
    if (n == 0):&lt;br /&gt;
        return 0&lt;br /&gt;
    elif (n == 1):&lt;br /&gt;
        return 1&lt;br /&gt;
    else:&lt;br /&gt;
        k0 = 0&lt;br /&gt;
        k1 = 1&lt;br /&gt;
        for i in range(2, n+1):&lt;br /&gt;
            k2 = k1 + k0&lt;br /&gt;
            k0 = k1&lt;br /&gt;
            k1 = k2&lt;br /&gt;
        return k2&lt;br /&gt;
&lt;br /&gt;
# fibo2(100000)&lt;br /&gt;
# くらいでも一瞬で答えが出る&lt;br /&gt;
&lt;br /&gt;
# フィボナッチ数(浜田の解法1)&lt;br /&gt;
&lt;br /&gt;
# n が奇数の時、F_n = F_{(n+1)/2}^2 + F_{(n-1)/2}^2&lt;br /&gt;
# n が偶数の時、F_n = F_{n/2 + 1}^2 - F_{n/2 - 1}^2&lt;br /&gt;
# という性質を使う&lt;br /&gt;
&lt;br /&gt;
def fibo3(n):&lt;br /&gt;
    if (n == 0):&lt;br /&gt;
        return 0&lt;br /&gt;
    elif (n == 1):&lt;br /&gt;
        return 1&lt;br /&gt;
    elif (n%2 == 1):&lt;br /&gt;
        return fibo2(n//2+1)**2 + fibo2(n//2)**2&lt;br /&gt;
    else:&lt;br /&gt;
        return fibo2(n//2+1)**2 - fibo2(n//2-1)**2&lt;br /&gt;
&lt;br /&gt;
# フィボナッチ数(浜田の解法2)&lt;br /&gt;
&lt;br /&gt;
# fibo3 では実は fibo2 を2回呼び出しているので余分に繰り返し&lt;br /&gt;
# 計算していることになるので、さらに改善できるはずである&lt;br /&gt;
# (効果が目に見えるのはよほど大きい n の場合になるが)。&lt;br /&gt;
# この関係式を繰り返し適用することにより、計算量オーダーをさらに&lt;br /&gt;
# 改善できることがわかる。&lt;br /&gt;
# 下に、fibo_i(n) という、隣り合うフィボナッチ数のペアを返す内部関数を&lt;br /&gt;
# 定義し、その内部関数を呼び出す形で fibo4(n) を定義する。&lt;br /&gt;
&lt;br /&gt;
def fibo_i(n):&lt;br /&gt;
    if (n == 0):&lt;br /&gt;
        return [1, 0]&lt;br /&gt;
    elif (n == 1):&lt;br /&gt;
        return [0, 1]&lt;br /&gt;
    elif (n == 2):&lt;br /&gt;
        return [1, 1]&lt;br /&gt;
    else:&lt;br /&gt;
        l = fibo_i(n//2)&lt;br /&gt;
        a = l[0]&lt;br /&gt;
        b = l[1]&lt;br /&gt;
        c = l[0]+l[1]&lt;br /&gt;
        if (n%2 == 1):&lt;br /&gt;
            return [c**2 - a**2, c**2 + b**2]&lt;br /&gt;
        else:&lt;br /&gt;
            return [b**2 + a**2, c**2 - a**2]&lt;br /&gt;
&lt;br /&gt;
def fibo4(n):&lt;br /&gt;
    if (n == 0):&lt;br /&gt;
        return 0&lt;br /&gt;
    elif (n == 1):&lt;br /&gt;
        return 1&lt;br /&gt;
    elif (n == 2):&lt;br /&gt;
        return 1&lt;br /&gt;
    else:&lt;br /&gt;
        l = fibo_i(n//2)&lt;br /&gt;
        a = l[0]&lt;br /&gt;
        b = l[1]&lt;br /&gt;
        c = l[0]+l[1]&lt;br /&gt;
        if (n%2 == 1):&lt;br /&gt;
            return c**2 + b**2&lt;br /&gt;
        else:&lt;br /&gt;
            return c**2 - a**2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
この他にも色々試して、追加してください。&lt;br /&gt;
&lt;br /&gt;
[[Category:学習ガイド]]&lt;/div&gt;</summary>
		<author><name>Taratta</name></author>
		
	</entry>
</feed>