SlideShare uma empresa Scribd logo
1 de 29
cp-9. 再帰関数
(C プログラミング入門)
URL: https://www.kkaneko.jp/pro/adp/index.html
1
金子邦彦
内容
例題1.スタック
局所変数,大域変数
例題2.再帰関数による総和
2
目標
• 局所変数を使った関数を理解する
• 関数の再帰呼び出しを使って,簡単な漸化式の
計算を行う
3
• スタックのプッシュ(push), ポップ(pop) を行う
関数を作る
• 次の2つの大域変数を使うこと
1. 配列stack
2. スタックポインタtop
4
例題1.スタック
スタックのプッシュとポップ
• プッシュ
(入れる操作)
• ポップ
(出す操作)
すでに
入っていた
データ
積み重なる
ように入る
すでに
入っていた
データ
一番最後に入った
データが先に出る
5
スタックとは
• 入れた順に積みあがっていく
1 1
2
3
2
1
2
1
2
1
4
push 1 push 2 push 3 pop push 4
6
#include <stdio.h>
int stack[100];
int top=0;
void push(int n)
{
stack[top]=n;
top++;
return;
}
int pop()
{
int n;
top--;
n = stack[top];
return n;
}
push関数
pop関数
7
スタック
main 関数の例
int main()
{
push(1);
push(2);
push(3);
printf( "%dn", pop() );
push(4);
printf( "%dn", pop() );
printf( "%dn", pop() );
printf( "%dn", pop() );
return 0;
} 8
スタック
実行結果の例
3
4
2
1
9
関数呼び出しの流れ
main 関数
int main()
push(1);
push(2);
push(3);
printf( "%dn", pop() );
push(4);
printf( "%dn", pop() );
printf( "%dn", pop() );
printf( "%dn", pop() );
関数呼び出し 戻り
push 関数
void push( int n )
return;
戻り
pop 関数
int pop()
return n;
10
配列によるスタックの実現
• スタック
• 十分に多くのデータを格納できる配列stackを用意.
• スタックポインタ
• 現在の「空き部分の底」を示す値(スタックポイ
ンタ)を格納させる変数topを用意.
• スタックの底は stack[0],スタックの頂上は
stack[top-1]
配列
スタックの底 stack[0]
スタックの頂上 stack[top-1]
空
空き部分の底 stack[top]
11
配列によるスタックの実現
• push 時: pushの後に,topの値を1足す
• pop 時: popの前に,topの値を1引く
1 1
2
3
2
1
2
1
2
1
4
push 1 push 2 push 3 pop push 4
1
top 2 3 4 3 4
12
局所変数
• 関数の仮引数と,関数本体内で宣言された変
数のこと
• 関数の内部でだけ有効
• ほかの関数(main関数など)からは直接アクセス
できない
• ある関数の局所変数と,呼び出した関数中の
局所変数と,例え同じ名前であっても,別の
実体である
13
大域変数
• 関数の外側で宣言された変数のこと
例) 配列stackとスタックポインタtopは,push
関数とpop関数のいずれからも参照できる.
#include <stdio.h>
int stack[100];
int top=0;
int push(int n)
{
stack[top]=n;
top++;
return n;
}
int pop()
{
int n;
top--;
n = stack[top];
return n;
}
これが大域変数
push関数と
pop関数で
共有される
14
局所変数と大域変数
局所変数 大域変数
宣言の場所 関数の仮引数
または関数内
関数の外側
有効範囲 関数の内部だ
けで有効
複数の関数で
共有される
15
スタックの使用例
• 正整数を読み込んだら,pushする.
• 負整数を読み込んだら,popして,取り出された値
を表示する.
• 0が読み込まれるまで上の操作を繰り返す.
16
#include <stdio.h>
#pragma warning(disable:4996)
int main()
{
int item;
top= -1;
do {
printf("Enter a number ");
scanf("%d",&item);
if (item>0) {
printf("pushed: %dn",item);
push(item);
} else if (item<0) {
printf("popped: %dn",pop());
}
} while (item!=0);
return 0;
} 17
課題1.スタック操作の例外処理
スタック操作のプログラムにおいて,
push 関数と pop 関数を書き換えて,
次に挙げた,2つの例外事象の対処を考慮しなさい.
1.スタックが空のときにポップ(pop)しない.
スタックが空のときに pop 関数が呼び出されると,「Stack
empty」のエラーメッセージを表示すること
2.スタックが満杯のときにプッシュ(push)しない.
スタックが満杯のときに push 関数が呼びだされると,
「Stack full」のエラーメッセージを表示すること
18
課題1のヒント
配列
スタックポインタの
値は 「0」
空のとき 満杯のとき
スタックポインタの
値は,「配列のサイズ」
•スタックポインタは,現在の「空き部分の底」の
位置を示す値 → 「スタック内のデータ数」に等しい
19
例題2.再帰関数による総和
• 整数Nから,1からNまで総和を求める再帰関数
を作る
例) 5 → 15
• 再帰関数とは,関数 f の本体にf の呼出しを含むよ
うな関数のこと













otherwise
1
if
1
1
1
1
n
i
n
i
i
n
n
i
20
再帰関数とは
• 自分自身を呼び出すような関数のこと
• 必ず終了条件が成立するように気をつけること
21
#include <stdio.h>
#pragma warning(disable:4996)
int sum(int n)
{
if (n < 1) {
return 0;
}
if (n == 1) {
return 1;
}
else {
return n+sum(n-1);
}
}
int main()
{
int n;
int s;
printf("Enter a number: ");
scanf("%d",&n);
s = sum(n);
printf("sum(%d)=%dn",n ,s);
return 0;
}
sum関数
main関数
22
再帰関数による総和
実行結果の例
Enter a number: 2
sum(2)=3
23
関数呼び出しの流れ
(main 関数で n = 2 のとき)
main 関数
int main()
sum(n);
関数呼び出し sum 関数
int sum( int n )
return n + sum(n-1);
関数呼び出しと戻
り
sum 関数
int sum( int n )
return 1;
戻り
24
n の値の変化
(main 関数で n = 2 のとき)
main 関数
int main()
sum(n);
関数呼び出し
sum 関数
int sum( int n )
return n + sum(n-1);
関数呼び出しと戻
り
return
1;
戻り
n = 2
sum 関数
int sum( int n )
n = 1
1を返す
3を返す
25
再帰関数による総和
n == 1
No
Yes
return 1;
return n + sum(n-1);
26
プログラム実行順
(main関数で n=2 のとき)
s = sum( n );
main 関数
int main()
n ==1
return n + sum(n-
1);
No
Yes
return 0;
sum 関数
int sum( int n )
関数
呼び出し
戻り
printf( "Enter a number:" );
scanf( "%d", &n );
return 0;
printf("sum(%d)=%dn",n ,s);
n ==1
return n + sum(n-
1);
No
Yes
return 1;
sum 関数
int sum( int n )
関数
呼び出し
戻り
27
データの流れ
s = sum( n );
return n + sum(n-1);
関数
呼び出し
戻り
① n の値を,
sum 関数に渡す
④返された値を
s に格納する
②渡された値は,
「n」という名前で使う
③ n-1 の値を,
sum 関数に渡す
⑤値「3」を返す
n 2
プログラム
データ
プログラム
main 関数
int main()
bar関数
int sum( int n )
n 2
データ
1
return1;
プログラム
bar関数
int sum( int n )
n
データ
1
④渡された値は,
「n」という名前で使う
関数
呼び出し
⑤値「1」を返す
戻り
28
return n+sum(n-1);
int sum(int n)
{
if (n < 1) {
return 0;
}
if (n==1) {
return 1;
}
else {
return n+sum(n-1);
}
}
呼び手
関
数
本
体
戻り値の受け取り
引数を仮引数にセットする
29

Mais conteúdo relacionado

Semelhante a cp-9. 再帰関数

x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチMasami Ichikawa
 
Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputingNoboru Irieda
 
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門伸男 伊藤
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門natrium11321
 
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編Yosuke Onoue
 
lispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep Learninglispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep LearningSatoshi imai
 
Introduction to NumPy & SciPy
Introduction to NumPy & SciPyIntroduction to NumPy & SciPy
Introduction to NumPy & SciPyShiqiao Du
 
NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門Shiqiao Du
 
Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料時響 逢坂
 
Brief introduction of Boost.ICL
Brief introduction of Boost.ICLBrief introduction of Boost.ICL
Brief introduction of Boost.ICLyak1ex
 
Boost9 session
Boost9 sessionBoost9 session
Boost9 sessionfreedom404
 
マスターオブゴールーチンアンドチャネル スタートGo #1
マスターオブゴールーチンアンドチャネル   スタートGo #1マスターオブゴールーチンアンドチャネル   スタートGo #1
マスターオブゴールーチンアンドチャネル スタートGo #1Takuya Ueda
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門Hideyuki Tanaka
 
15分でざっくり分かるScala入門
15分でざっくり分かるScala入門15分でざっくり分かるScala入門
15分でざっくり分かるScala入門SatoYu1ro
 
Or seminar2011final
Or seminar2011finalOr seminar2011final
Or seminar2011finalMikio Kubo
 

Semelhante a cp-9. 再帰関数 (20)

全探索
全探索全探索
全探索
 
x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチ
 
Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputing
 
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
 
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編
 
lispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep Learninglispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep Learning
 
cp-11. ポインタ
cp-11. ポインタcp-11. ポインタ
cp-11. ポインタ
 
ji-6. 配列
ji-6. 配列ji-6. 配列
ji-6. 配列
 
Coqチュートリアル
CoqチュートリアルCoqチュートリアル
Coqチュートリアル
 
Introduction to NumPy & SciPy
Introduction to NumPy & SciPyIntroduction to NumPy & SciPy
Introduction to NumPy & SciPy
 
cp-8. 関数
cp-8. 関数cp-8. 関数
cp-8. 関数
 
NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門NumPyが物足りない人へのCython入門
NumPyが物足りない人へのCython入門
 
Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料
 
Brief introduction of Boost.ICL
Brief introduction of Boost.ICLBrief introduction of Boost.ICL
Brief introduction of Boost.ICL
 
Boost9 session
Boost9 sessionBoost9 session
Boost9 session
 
マスターオブゴールーチンアンドチャネル スタートGo #1
マスターオブゴールーチンアンドチャネル   スタートGo #1マスターオブゴールーチンアンドチャネル   スタートGo #1
マスターオブゴールーチンアンドチャネル スタートGo #1
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門
 
15分でざっくり分かるScala入門
15分でざっくり分かるScala入門15分でざっくり分かるScala入門
15分でざっくり分かるScala入門
 
Or seminar2011final
Or seminar2011finalOr seminar2011final
Or seminar2011final
 

Mais de kunihikokaneko1

cs-8. 表計算ソフトウエアを用いたデータの扱い
cs-8. 表計算ソフトウエアを用いたデータの扱い cs-8. 表計算ソフトウエアを用いたデータの扱い
cs-8. 表計算ソフトウエアを用いたデータの扱い kunihikokaneko1
 
cs-7. 乱数,シミュレーション
cs-7. 乱数,シミュレーション  cs-7. 乱数,シミュレーション
cs-7. 乱数,シミュレーション kunihikokaneko1
 
cs-6. データベースとデータサイエンス
cs-6. データベースとデータサイエンスcs-6. データベースとデータサイエンス
cs-6. データベースとデータサイエンスkunihikokaneko1
 
cs-5. 人工知能の概要
cs-5. 人工知能の概要 cs-5. 人工知能の概要
cs-5. 人工知能の概要 kunihikokaneko1
 
cs-4. プログラミング入門
cs-4. プログラミング入門cs-4. プログラミング入門
cs-4. プログラミング入門kunihikokaneko1
 
cs-3. パノラマ画像,ストリートビュー,3次元コンピュータグラフィックス
cs-3. パノラマ画像,ストリートビュー,3次元コンピュータグラフィックスcs-3. パノラマ画像,ストリートビュー,3次元コンピュータグラフィックス
cs-3. パノラマ画像,ストリートビュー,3次元コンピュータグラフィックスkunihikokaneko1
 
cs-2. コンピュータによる画像制作,人工知能でできること,情報のコード化,デジタル画像,画素
cs-2. コンピュータによる画像制作,人工知能でできること,情報のコード化,デジタル画像,画素 cs-2. コンピュータによる画像制作,人工知能でできること,情報のコード化,デジタル画像,画素
cs-2. コンピュータによる画像制作,人工知能でできること,情報のコード化,デジタル画像,画素 kunihikokaneko1
 
cs-1. 無料ソフトウエア,無料データ,エコシステム,Scratch プログラミング,Scratch のキャラクタ
cs-1. 無料ソフトウエア,無料データ,エコシステム,Scratch プログラミング,Scratch のキャラクタcs-1. 無料ソフトウエア,無料データ,エコシステム,Scratch プログラミング,Scratch のキャラクタ
cs-1. 無料ソフトウエア,無料データ,エコシステム,Scratch プログラミング,Scratch のキャラクタkunihikokaneko1
 
mi-8. 人工知能とコンピュータビジョン
mi-8. 人工知能とコンピュータビジョンmi-8. 人工知能とコンピュータビジョン
mi-8. 人工知能とコンピュータビジョンkunihikokaneko1
 
mi-7. 学習と検証, 学習不足, 過学習, 学習曲線
mi-7. 学習と検証, 学習不足, 過学習, 学習曲線mi-7. 学習と検証, 学習不足, 過学習, 学習曲線
mi-7. 学習と検証, 学習不足, 過学習, 学習曲線kunihikokaneko1
 
mi-6. 画像分類システム
mi-6. 画像分類システムmi-6. 画像分類システム
mi-6. 画像分類システムkunihikokaneko1
 
mi-5. ディープラーニング
mi-5. ディープラーニングmi-5. ディープラーニング
mi-5. ディープラーニングkunihikokaneko1
 
mi-3. データサイエンス・AIの演習
mi-3. データサイエンス・AIの演習mi-3. データサイエンス・AIの演習
mi-3. データサイエンス・AIの演習kunihikokaneko1
 
mi-2. データサイエンス・AIの事例
mi-2. データサイエンス・AIの事例mi-2. データサイエンス・AIの事例
mi-2. データサイエンス・AIの事例kunihikokaneko1
 
mi-1. 人工知能の概要
mi-1. 人工知能の概要mi-1. 人工知能の概要
mi-1. 人工知能の概要kunihikokaneko1
 
Coding Standards of C++ について
 Coding Standards of C++ について  Coding Standards of C++ について
Coding Standards of C++ について kunihikokaneko1
 
co-3. サブクラス、継承
co-3. サブクラス、継承co-3. サブクラス、継承
co-3. サブクラス、継承kunihikokaneko1
 
co-2. メソッド定義と呼び出し
co-2. メソッド定義と呼び出しco-2. メソッド定義と呼び出し
co-2. メソッド定義と呼び出しkunihikokaneko1
 

Mais de kunihikokaneko1 (20)

cs-8. 表計算ソフトウエアを用いたデータの扱い
cs-8. 表計算ソフトウエアを用いたデータの扱い cs-8. 表計算ソフトウエアを用いたデータの扱い
cs-8. 表計算ソフトウエアを用いたデータの扱い
 
cs-7. 乱数,シミュレーション
cs-7. 乱数,シミュレーション  cs-7. 乱数,シミュレーション
cs-7. 乱数,シミュレーション
 
cs-6. データベースとデータサイエンス
cs-6. データベースとデータサイエンスcs-6. データベースとデータサイエンス
cs-6. データベースとデータサイエンス
 
cs-5. 人工知能の概要
cs-5. 人工知能の概要 cs-5. 人工知能の概要
cs-5. 人工知能の概要
 
cs-4. プログラミング入門
cs-4. プログラミング入門cs-4. プログラミング入門
cs-4. プログラミング入門
 
cs-3. パノラマ画像,ストリートビュー,3次元コンピュータグラフィックス
cs-3. パノラマ画像,ストリートビュー,3次元コンピュータグラフィックスcs-3. パノラマ画像,ストリートビュー,3次元コンピュータグラフィックス
cs-3. パノラマ画像,ストリートビュー,3次元コンピュータグラフィックス
 
cs-2. コンピュータによる画像制作,人工知能でできること,情報のコード化,デジタル画像,画素
cs-2. コンピュータによる画像制作,人工知能でできること,情報のコード化,デジタル画像,画素 cs-2. コンピュータによる画像制作,人工知能でできること,情報のコード化,デジタル画像,画素
cs-2. コンピュータによる画像制作,人工知能でできること,情報のコード化,デジタル画像,画素
 
cs-1. 無料ソフトウエア,無料データ,エコシステム,Scratch プログラミング,Scratch のキャラクタ
cs-1. 無料ソフトウエア,無料データ,エコシステム,Scratch プログラミング,Scratch のキャラクタcs-1. 無料ソフトウエア,無料データ,エコシステム,Scratch プログラミング,Scratch のキャラクタ
cs-1. 無料ソフトウエア,無料データ,エコシステム,Scratch プログラミング,Scratch のキャラクタ
 
mi-8. 人工知能とコンピュータビジョン
mi-8. 人工知能とコンピュータビジョンmi-8. 人工知能とコンピュータビジョン
mi-8. 人工知能とコンピュータビジョン
 
mi-7. 学習と検証, 学習不足, 過学習, 学習曲線
mi-7. 学習と検証, 学習不足, 過学習, 学習曲線mi-7. 学習と検証, 学習不足, 過学習, 学習曲線
mi-7. 学習と検証, 学習不足, 過学習, 学習曲線
 
mi-6. 画像分類システム
mi-6. 画像分類システムmi-6. 画像分類システム
mi-6. 画像分類システム
 
mi-5. ディープラーニング
mi-5. ディープラーニングmi-5. ディープラーニング
mi-5. ディープラーニング
 
mi-4. 機械学習
mi-4. 機械学習mi-4. 機械学習
mi-4. 機械学習
 
mi-3. データサイエンス・AIの演習
mi-3. データサイエンス・AIの演習mi-3. データサイエンス・AIの演習
mi-3. データサイエンス・AIの演習
 
mi-2. データサイエンス・AIの事例
mi-2. データサイエンス・AIの事例mi-2. データサイエンス・AIの事例
mi-2. データサイエンス・AIの事例
 
mi-1. 人工知能の概要
mi-1. 人工知能の概要mi-1. 人工知能の概要
mi-1. 人工知能の概要
 
kaneko202304.pptx
kaneko202304.pptxkaneko202304.pptx
kaneko202304.pptx
 
Coding Standards of C++ について
 Coding Standards of C++ について  Coding Standards of C++ について
Coding Standards of C++ について
 
co-3. サブクラス、継承
co-3. サブクラス、継承co-3. サブクラス、継承
co-3. サブクラス、継承
 
co-2. メソッド定義と呼び出し
co-2. メソッド定義と呼び出しco-2. メソッド定義と呼び出し
co-2. メソッド定義と呼び出し
 

cp-9. 再帰関数