情報処理ⅱ-wakayama.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
情報処理ⅱ-wakayama

情報処理Ⅱ 第8回:2003年12月9日(火) 前回の講義の見直し 識別子の宣言(関数?変数の定義)に関する補足 constを含む変数と代入 識別子の宣言に関する補足 グローバル区間に同一の識別子を複数宣言できない. 関数と同じ名前の変数もNG. ブロック内(ローカル)に変数を定義するときは,それより外の識別子と重複してもよい. ブロック内では,重複する外の識別子は使用できない. モジュール化に関して有用なルール. 関数はブロック内で定義できない. 必ずグローバル区間での定義となる. グローバル - global - 大域的 - あらゆるブロックの外 ローカル - local - 局所的 - あるブロックの中 constを含む変数と代入 constを含む型について,オブジェクトの参照はOK. 代入など,左辺値としての使用はよくない(警告). ポインタの代入について const char *p; char *q;としたとき, constなしからconstあり p q; はOK. constありからconstなし q p; はよくない(警告). キャスト演算子による変換 q char * p; はOK. 記憶域クラスには適用できない(型の一部ではない). x static int y; はNG(コンパイルエラー). 本日のテーマ:再帰 recursion Cでは,関数の内部で自分自身を呼び出す(再帰呼び出し,recursive call)ような記述ができる. 再帰的(帰納的,循環的)な定義の実装や,バックトラック backtrack ,分割統治法 divide-and-conquer といった手法に対してよく用いられる. 注意点 無限ループにならないようにする. 再帰を使わないほうがよいこともある. 例題1 カウントダウンするプログラム 自作関数countdownの定義の中で,countdownを呼び出している. 例題1のプロセス状態は? 同一の変数名 x に対して複数のオブジェクトが生成される点に注意. 例題1のバリエーション 出力の位置を変えると,countupになる. 再帰なしのプログラムのほうが,効率はよい. なぜ再帰なしのほうが効率がよいか? …関数呼び出しのコストが大きいから. 再帰的な定義の例(1) 階乗 0! 1, 1! 1 n! n× n-1 !  n≧2 フィボナッチ数列(例題2) a1 1, a2 1 an an-1 + an-2   n≧3 再帰を用いれば,シンプルに書ける. しかしこれらも,whileループのほうが効率がよい. 再帰的な定義の例(2) UNIXのファイル構造 「ディレクトリ」には「ファイル」を配置できる. ファイルには,「通常ファイル」と「ディレクトリ」がある(実際にはもっとさまざまな種類のファイルがある). ディレクトリは「親ディレクトリ」をちょうど1つ持つ. そこで問題 あるディレクトリから下のすべてのファイル名を出力するには? ディレクトリが持つファイルを(1個1個,順に)獲得すし,そのファイル名を出力する. それがディレクトリであれば,(再帰的に)そのディレクトリから下のすべてのファイル名を出力する. 本質的にこれは「木 tree の探索問題」であり,さまざまなアルゴリズムが知られている. 例題3:ぷよ連結問題 右図のような(2次元)フィールドと,その中の座標を入力に取り,そこと連結する「ぷよ」の個数を求めよ. フィールドの表現 フィールドは2次元 ?2次元配列を使用 色は赤?青?黄と空白 ?int型で表現 再帰の使い方 関数プロトタイプは int consize int x, int y, int color ; x, y と連結していて色がcolorである「ぷよ」の数を返す. フィールド情報は,関数の「外」から与える. 戻り値は, (探索打ち切りの)条件を満たすときは,0 そうでなければ, 1 + consize x + 1, y, color + consize x - 1, y, color + consize x, y + 1, color + consize x, y - 1, color 探索打ち切りの条件 以下のいずれか x, y が範囲外 color 0 field[y][x] ! color x, y の地点は探索済み 探索済みかどうかを記憶するための領域も必要. int field_checked[高さ][幅]; で確保する. 分割統治法 対象領域を細分化して求め(分割),全体として正しい解になる(統治)ようにする. 例: クイックソート まとめ 再帰的に定義された問題は,再帰呼

文档评论(0)

cynthia_h + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档