12. n <= 2
例
return 1
fibo
繰り返しによってフィ
ボナッチ数を求める
R
a = 1
b = 1
i = 2
a = b
public static int fibo(int n) {
if (n <= 2)
return 1;
int a = 1;
int b = 1;
for (int i = 2; i < n; ++i) {
int c = a + b;
a = b;
b = c;
}
return b;
}
2013/10/25
i < n
c = a + b
手続き(Java)
20
21
22
23
24
25
26
27
28
29
30
31
i < n
IPSJ SIGSS 2013年10月研究会 於 金沢
return b
b = c
i < n
13. n <= 2
例
return 1
fibo
●
分岐構造
➡ Or節点
R
a = 1
i < n
b = 1
i = 2
i < n
c = a + b
a = b
20
21
22
23
24
25
26
27
28
29
30
31
public static int fibo(int n) {
if (n <= 2)
return 1;
int a = 1;
int b = 1;
for (int i = 2; i < n; ++i) {
int c = a + b;
a = b;
b = c;
}
return b;
}
2013/10/25
IPSJ SIGSS 2013年10月研究会 於 金沢
return b
b = c
i < n
14. n <= 2
例
return 1
fibo
●
繰り返し構造
➡ Or/And節点
a = 1
b = 1
R
0回の繰り返し
i < n
1回の繰り返し
i = 2
i < n
c = a + b
a = b
20
21
22
23
24
25
26
27
28
29
30
31
return b
b = c
public static int fibo(int n) {
if (n <= 2)
i < n
return 1;
int a = 1;
int b = 1;
for (int i = 2; i < n; ++i) {
int c = a + b;
a = b;
実装では0回と 回の繰り返しに相当
1
b = c;
する部分だけを生成
}
return b;
← 仮定: それより多い回数の繰り
}
2013/10/25
返しは検索目的では不要
IPSJ SIGSS 2013年10月研究会 於 金沢
15. 例 (プログラム全体)
1 class Fibo {
2
public static void main(String[] args) {
3
int n = inputNumber(args);
4
int fiboN = Fibo.fibo(n);
main
エントリポイント
5
outputAnswer(fiboN);
6
}
inputNumber
コンソール入力
7
public static int inputNumber(String[] args) {
8
String numStr = null;
9
if (args.length >= 1)
outputNumber コンソール出力
10
numStr = args[0];
11
else {
fibo
フィボナッチ数の計算
12
java.io.Console cnsl = System.console();
13
numStr = cnsl.readLine("n = ? ");
(前述)
14
}
15
return Integer.valueOf(numStr);
16
}
17
public static void outputAnswer(int n) {
18
System.out.println("fibo(n) = " + n);
19
}
20
public static int fibo(int n) {
21
if (n <= 2)
22
return 1;
23
int a = 1;
24
int b = 1;
25
for (int i = 2; i < n; ++i) {
26
int c = a + b;
27
a = b;
28
b = c;
29
}
30
return b;
31
}
32 }
IPSJ SIGSS 2013年10月研究会 於 金沢
2013/10/25
プログラムの構造
16. 例 (プログラム全体)
1 class Fibo {
2
public static void main(String[] args) {
3
int n = inputNumber(args);
4
int fiboN = Fibo.fibo(n);
●
5
outputAnswer(fiboN);
6
}
7
public static int inputNumber(String[] args) {
8
String numStr = null;
9
if (args.length >= 1)
10
numStr = args[0];
11
else {
12
java.io.Console cnsl = System.console();
13
numStr = cnsl.readLine("n = ? ");
14
}
15
return Integer.valueOf(numStr);
16
}
inputNumber
17
public static void outputAnswer(int n) {
18
System.out.println("fibo(n) = " + n);
19
}
20
public static int fibo(int n) {
21
if (n <= 2)
22
return 1;
main
23
int a = 1;
24
int b = 1;
25
for (int i = 2; i < n; ++i) {
26
int c = a + b;
27
a = b;
printAnswer
28
b = c;
29
}
30
return b;
31
}
32 }
IPSJ SIGSS 2013年10月研究会 於 金沢
2013/10/25
呼び出し ➡ Call節点
numStr = null
args.length >= 1
numStr = args[0]
cnsl =
System.console
numStr =
cnsl.readLine
Integer.valueOf
"fibo(n) = " + n
println
18. And/Or/Callグラフから実行パスへ
1. 根(実行を開始するエントリポイント)を決めて、
2. 深さ優先で走査する
2-1. And節点の子節点はすべて走査する
2-2. Or節点/Call節点の子節点はひとつ選択して走査する
n <= 2
n <= 2
return 1
fibo
R
a = 1
return 1
i < n
fibo
b = 1
i = 2
R
i < n
a = 1
i < n
b = 1
i = 2
i < n
c = a + b
a = b
return b
c = a + b
a = b
b = c
i < n
2013/10/25
IPSJ SIGSS 2013年10月研究会 於 金沢
return b
b = c
i < n