Views
データ構造とアルゴリズムの基礎(続き)
アルゴリズム、プログラミング言語、プログラムの処理
先週、積み木にはまったので
- 今回は一気に1章を終わる
たとえば
- 最大公約数を求める
- 最大公約数は小さいほうの数に等しいかより小さい
- 小さいほうの数から始めて1ずつ減らして確かめる
アルゴリズム(流れ図)
ユークリッド(Euclid)の互除法
- 剰余を求めていく
再帰的アルゴリズム
- Recursive
- 数学的帰納法と同じ
def rgcd(a, b): if b == 0: return a else: return rgcd(b, a % b)
計算量
- O(n) ... n に比例
- O(n2) ... n の2乗に比例
- O(log n) ... log n に比例
- O(n log n) ... n log n に比例
- O(na)
- O(an) ... n 大で手に負えない
- O(n!) ... 同上
プログラミング言語
- Python 特徴
- begin end { } ; が無い
- インデント、改行でプログラムの構造を決める
- 変数の型が無い
- オブジェクトに型がある
golden を python で書いてみる
def increment(a, k, x): b = a for i in range(k): b = a + b a = b - a x = float(b) / a print "%5d %5d %10.5f" % (a, b, x) n, times = raw_input("input n and times: ").split() n = int(n) times = int(times) ratio = 0. if n > 0: increment(n, times, ratio) print "%5d %5d %10.5f :main" % (n, times, ratio)
ちなみに
プログラム言語にあるもの
- 代入
- 関数(又は関数と手続き)
- 条件分岐
- 繰り返し
代入
- a := b (Pascal/ALGOL)
- a = b (C/Python)
関数
- 戻り値が無い ... 手続き (Pascal)
- 戻り値はひとつ ... 関数の型宣言 (C)
- 戻り値はオブジェクト ... Python
- return x, y (タプルオブジェクト)
条件分岐
- if / if ... else
- switch / case
- if ... elif ... elif ... else
繰り返し
- while 条件 (do) ...
- repeat ... until 条件
- 2番目の型は while 1 ... if 条件 break
Call by ...
- call by value ... 値呼び出し
- 元の変数値は変わらない
- call by reference ... 参照呼出し
- 関数内での操作によって変数の値が変わる
C 言語の場合
int val(int x) { x = x + x; return x; } main() { int x, y; x = 1; y = val(x); printf("%d %d\n", x, y); }
- 出力 ... 1 2
C 言語の場合(2)
int val(int *x) { *x = *x + *x; return *x; } main() { int x, y; x = 1; y = val(&x); printf("%d %d\n", x, y); }
- 出力 ... 2 2
Python では?
- 変数は全てオブジェクトへの reference
- では、Cの(2) になるか?
- 変更可能 (mutable) 変更不可能 (immutable) によって違う
変更不可能の場合
def immutable(x): x = x + x return x x = 1 y = immutable(x) print x, y
- 出力 ... 1 2
変更可能の場合
本日の問題
- ユークリッドのアルゴリズムを用いて、次の2つの数の最大公約数を求めなさい。
- 自分の生(年)月日から3ないし4桁の整数を作る
- 5月5日なら 505
- 今日の日付(425)
- 次週は連休の間で休講・次回の講義は5月9日
回答例
- 505 % 425 = 80
- 425 % 80 = 25
- 80 % 25 = 5
- 25 % 5 = 0
- よって GCD = 5
一番大きかった人
- 1020 % 425 = 170
- 425 % 170 = 85
- 170 % 85 = 0
- GCD = 85
- 惜しいことに計算ミスしてました。