コンピュータプログラミング - Pythonでアルゴリズムを実装しながら問題解決を行う -

電子情報通信レクチャーシリーズ B-7

コンピュータプログラミング - Pythonでアルゴリズムを実装しながら問題解決を行う -

Pythonプログラミングを用い,問題を解決する能力が身に着くことを目指す。

ジャンル
発行年月日
2022/04/28
判型
B5
ページ数
208ページ
ISBN
978-4-339-01822-6
コンピュータプログラミング - Pythonでアルゴリズムを実装しながら問題解決を行う -
在庫あり

定価

3,630(本体3,300円+税)

カートに入れる

電子版を購入

購入案内

  • 内容紹介
  • まえがき
  • 目次
  • レビュー
  • 著者紹介
  • 広告掲載情報

現在はプログラミング花盛りである.日本では,2020年度の小学校でのプログラミング教育必修化を皮切りに,中学校でも,そして2022年度には高校教育でも必修化する.大学では,数理・データサイエンス・AI教育の強化から,文系理系問わず,プログラミング教育を必修化する大学が増えてきた.

本書は,プログラミング教育にうってつけの教科書・演習書である.現在,AI・データサイエンスで一番利用され注目されているプログラミング言語Pythonを採用.執筆にあたり,問題解決を通して,課題の背後にある関連知識も身に付けながら,その解法をアルゴリズムとして思索し,プログラムによって実現するように心がけた.つまり,本書の特徴は,プログラミングによる問題解決法を修得することであり,プログラミングの楽しさを引き出し,その素養を涵養できるように工夫した.

プログラミング言語の文法習得には多くの時間を要し,そのプロセスが長すぎると途中で挫折し,本来の目的が成就できない.そこで本書は,細かい文法やプログラミングの枝葉末節を余り気にせずに,味のある問題を解きながら,一気通貫でプログラミングを修得できるように工夫した.

以上の思いを抱いて,8章構成で「問題解決を通してプログラミングを楽しむ」を達成する.総本山8章では,最適化問題をプログラミングにより解決する.その際の重要な概念が,モジュール化,抽象化であり,その具現化であるオブジェクト指向の概念を7章で学ぶ.プログラムはデータ構造と制御フローから成り.2章~4章で修得できる.5章はループ構造,6章は関数である.付録ではPythonのデータ構造・主な関数を中心にまとめた.以下,各章のトピックスを列記する.

1章:探索問題,ソーティング,最短経路問題,最適化問題,計算可能関数
2章:数とf文字列,パッキング・アンパッキング,フェルマーの小定理,ラムダ式による無名関数定義,条件式による閏年判定,偽造硬貨・天秤問題,ユークリッドの互除法,不定方程式と最大公約数,二分法と黄金比,ビット演算による線形時間のじゃんけんプログラム
3章:関数のグラフと図的表現,素数判定,エラーと例外処理,アルゴリズム解析と計算量
4章:代入文の仕組み,参照渡し,データ型,基数による数の表現,選択・挿入ソート,文字列とたぬきの暗号,ツェラーの公式,アリとキリギリス,エラトステネスのふるい,グラフの到達可能性問題,ダイクストラの最短経路法,スタックによる逆ポーランド記法の評価,キューによるラウンドロビン・スケジューリング
5章:ニュートン・ラフソン法,数が作る美,内包表記と繰り返し
6章:関数と再帰,グローバル変数・局所変数,位置引数・キーワード引数・デフォルト値,補助関数,可変長引数,階乗関数,フィボナッチ数列,回文と数でも回文,再帰の効率化
7章:オブジェクト指向プログラミング,クラス定義,継承,イテレータの実装,カプセル化
8章:アルゴリズムと設計戦略,有名人の問題,線形探索,二分探索,貪欲法,動的計画法,コイン問題,ナップザック問題,バケツによる水くみ問題

【関連キーワード】
Python,プログラミング,アルゴリズム,フェルマー,偽造硬貨天秤問題,ユークリッドの互除法,水くみ問題,二分法と黄金比,じゃんけん,たぬき暗号,ツェラーの公式,エラトステネスの篩,最短経路,逆ポーランド法,ラウンドロビン法,ニュートン法,フィボナッチ数列,回文,貪欲・動的計画法,コイン・ナップザック問題

本書は,「プログラミング」の教科書である.より正確にいえば,問題解決のためのアルゴリズムとその実装の教本である.プログラミングとはプログラムを作成する総合的なプロセスであるが,プログラムはコンピュータに限った術語だけではない.入学式のプログラム,TVプログラム,教育プログラムなどのプログラムもある.共通するのは,ことの順番という概念であり,どの使用例でも順序が重要となる.以上から,「コンピュータプログラムとは,コンピュータにやらせたい処理を順番に書いたもの」となる.昨今では,書かれた通りにプログラムは必ずしも実行されない.本書では,人工知能分野や教育分野で一番利用頻度が高いPythonというプログラミング言語を採用し,プログラミング教育を行う.

人工知能,深層学習の社会的インパクトの大きさから,プログラミングの重要性が全世界的に認識されつつある.プログラミングを習得すれば,誰でもAIプログラムを書けるようになったのである.日本においても,ついに2020年度にプログラミングが小学校教育で必修化になった.中学では2021年度に,高校教育では2022年度に必修化する.大学教育においても,文部科学省の指導もあり,プログラミングを全学必修とする大学も出てきた.

プログラミング言語の歴史をひも解くと,年々プログラミングは人間に寄り添ってきた.しかし,自然言語で自由奔放にその解法アルゴリズムを書いても,いまだにコンピュータは処理できない.まだ人間とコンピュータの間には,ギャップがある.その中でも,Pythonは,人間の思考法や表現法に比較的近い特徴を有するプログラミング言語である.本書では,アルゴリズムの記述・実装としてPythonを採用し,そのプログラミングスタイルに従う.

本書はプログラミングの入門書であるが,文法書ではない.問題解決という目的のために,その背後の関連知識も身に付けながら,その解法をアルゴリズムとして思索し,プログラムによって実現する.つまり,本書の目的は,プログラミングによる問題解決法を習得することを目的とする.つまり,昨今のデータサイエンティストのように,課題を解決していく能力を涵養したい.そのためには,数学,エンジニアリング,サイエンスの素養も身に付けなければならない.

有能なプログラマーは,数学者のように数学という武器を利用して頭に浮かんだアイディアを表現・推論し,ときには証明・計算もする.またときには,エンジニアのようにことがらを設計し,システムまで組み立て全体をテスト・評価する.またときには,自然科学者のように自然界を観察し,仮説を立て予測を評価・証明する.プログラマーにとって最も重要な能力は,問題解決能力である.問題の所在を確かめ,定式化し,創造的に解決法を思考し,正確かつ効率よく問題を解決していく.プログラミングは,問題解決能力を磨く絶好のタスクである.

以上の思いを描いて,8章構成で本書の目的を達成する.最後の8章では,代表的な問題をプログラミングを通して解決していく.そこで重要なのが,モジュール化,抽象化の概念であり,その思想の具現化であるオブジェクト指向の概念を7章で学ぶ.プログラムは,データ構造と制御構造からなる.Pythonの柔軟で強力なデータ構造力を4章で学ぶ.制御構造については,残りの章で学ぶ.1章は序章であるが,2章から4章は,チュートリアル的存在である.つまり,4章まで読めば,一通りのプログラムが書ける能力を有するように工夫した.3章の前半では,局所変数・大域変数,スコープといった関数の重要な概念を補完する.また,後半では,エラーと例外処理に切り込む.5章で条件分岐とループ構造,6章で簡易的抽象化・モジュール化の具体化である関数を習得し,再帰関数でその章を締めくくる.学習者の利便性を考慮し,付録ではPythonのデータ構造・主な関数を中心にまとめた.必要に応じて,参照していただきたい.

本書執筆に当たり,本書査読者の教科書委員会幹事・東京大学名誉教授の石塚満先生には,著者が気づかない細部にまで目を通していただいた.また,公立大学法人宮城大学の須栗裕樹教授には,草稿段階の粗削りのテキスト並びに校正稿を精読いただき,適切なコメントを頂いた.

最後に,本書執筆の機会を与えていただいた電子情報通信学会教科書委員会の皆様,そして怠惰な執筆者を辛抱強く待ち続け,本書完成までお付き合いいただいた委員会・コロナ社の担当者には最大の感謝を表したい.また,刊行にあたりお世話になったコロナ社に敬意を表する次第である.

2022年2月
富樫 敦

1. プログラミングとは
1.1 はじめに
1.2 プログラミングとは
1.3 アルゴリズムとプログラム
1.4 問題解決とアルゴリズムに関する基礎知識
 1.4.1 探索問題
 1.4.2 ソーティング問題
 1.4.3 最短経路問題
 1.4.4 最適化問題
1.5 計算可能関数
本章のまとめ
理解度の確認

2. プログラミング・チュートリアル(制御フロー編)
2.1 数とその表現
 2.1.1 数とf文字列
 2.1.2 prin(t)関数
 2.1.3 指数形式の浮動小数点数表示
 2.1.4 タプル・パッキング&シーケンス・アンパッキング
2.2 算術演算と式の計算
 2.2.1 算術演算
談話室 Jupyter Notebookのセル
 2.2.2 式の計算
 2.2.3 フェルマーの小定理
2.3 変数・代入・平方根
談話室 コメントを追加する
2.4 関数定義
 2.4.1 def文による無名関数定義
 2.4.2 ラムダ式による関数定義
2.5 条件分岐
 2.5.1 条件分岐とは
 2.5.2 うるう年
 2.5.3 偽造硬貨・天秤問題
2.6 繰返し(ループ)
 2.6.1 繰返し構造のパターン
 2.6.2 ユークリッドの互除法(while文の適用例)
談話室 水汲み問題
 2.6.3 二分法による平方根の求め方(while文の適用例)
 2.6.4 じゃんけんプログラム
本章のまとめ
理解度の確認

3. プログラミング・チュートリアル(制御フロー編・発展編)
3.1 関数(発展的話題)
 3.1.1 関数のグラフ
 3.1.2 関数の図的表現
 3.1.3 素数判定
3.2 エラーと例外処理
 3.2.1 構文エラー
 3.2.2 例外
 3.2.3 例外処理
 3.2.4 例外発生
 3.2.5 assert文
3.3 アルゴリズムとプログラム
 3.3.1 アルゴリズムとは
 3.3.2 アルゴリズムの記述
 3.3.3 アルゴリズム解析と計算量
 3.3.4 時間計算量からみたアルゴリズムの主なクラス
本章のまとめ
理解度の確認

4. プログラミング・チュートリアル(データ構造編)
4.1 変数とその評価
 4.1.1 代入文の処理系上の仕組み
 4.1.2 変数への値の渡し方と参照渡し
4.2 データ型
 4.2.1 用途と特徴に応じたデータ構造の分類
 4.2.2 数・数値
 4.2.3 リスト
 4.2.4 文字列
 4.2.5 タプル
 4.2.6 range
 4.2.7 辞書(ディクショナリ)
 4.2.8 集合
4.3 グラフの実現とアルゴリズム
 4.3.1 グラフの実現法(表現法)
 4.3.2 到達可能性問題
 4.3.3 グラフ問題:ダイクストラの最短経路アルゴリズム
4.4 オブジェクト指向
 4.4.1 オブジェクト指向プログラミングとは
 4.4.2 データ構造スタックとキュー
 4.4.3 スタックのクラス定義と応用
 4.4.4 キューのクラス定義と応用
本章のまとめ
理解度の確認

5. 条件分岐と繰返し
5.1 条件分岐
 5.1.1 選択:if文による条件分岐
 5.1.2 偽造硬貨問題
5.2 条件的繰返し処理(whileループ)
 5.2.1 while文による条件的繰返し
 5.2.2 ニュートン・ラフソン法
5.3 反復可能オブジェクトによる繰返し(forループ)
 5.3.1 for文の構造
 5.3.2 繰返し回数の指定法
 5.3.3 繰返し処理例:数が作る美
5.4 繰返しからの脱却
 5.4.1 脱却のイメージ:三つのケース
 5.4.2 プログラム例
5.5 内包表記と繰返し
 5.5.1 集合の外延的表記と内包的表記
 5.5.2 リスト内包表記
本章のまとめ
理解度の確認

6. 関数と再帰
6.1 関数の基礎
 6.1.1 関数定義
 6.1.2 グローバル変数
6.2 Pythonでの関数流儀
 6.2.1 位置引数・キーワード引数・デフォルト値
 6.2.3 関数の中で補助関数を利用
 6.2.4 可変長引数
6.3 再帰関数
 6.3.1 再帰関数とは
 6.3.2 階乗関数
 6.3.3 フィボナッチ数列
 6.3.4 回文
6.4 再帰関数の効率化
 6.4.1 再帰関数の実行の仕組み
 6.4.2 再帰関数の効率化
本章のまとめ
理解度の確認

7. オブジェクト指向プログラミング
7.1 オブジェクト指向とは
7.2 クラスの定義
 7.2.1 クラス定義
 7.2.2 インスタンス属性・インスタンスメソッド
 7.2.3 クラス属性・クラスメソッド
7.3 クラスの継承
7.4 オブジェクト指向プログラミングの醍醐味
 7.4.1 イテラブルクラス・イテレータクラスの実装
 7.4.2 カプセル化
本章のまとめ
理解度の確認

8. 問題解決とプログラミング
8.1 アルゴリズム設計戦略
 8.1.1 問題解決とアルゴリズム設計
 8.1.2 縮小統治法による有名人の問題解決
8.2 探索問題
 8.2.1 線形探索アルゴリズム
 8.2.2 二分探索アルゴリズム
 8.2.3 数以外の探索問題
8.3 ソーティングアルゴリズム
8.4 貪欲アルゴリズム
 8.4.1 コイン問題
 8.4.2 ナップザック問題
 8.4.3 ダイクストラの最短経路アルゴリズム
8.5 動的計画法
 8.5.1 動的計画法とは
 8.5.2 コイン問題
本章のまとめ
理解度の確認

付録
1. 演算
2. データ型一般
3. シーケンス型の操作
4. データ型独自の固有操作
5. 組み込みデータ型間の変換
6. deque

引用・参考文献
索引

読者モニターレビュー【 理系大学生 様(ご専門:化学)】

本書はPythonの初心者を対象にどのようにしてPythonでプログラミングを行うかについて解説した書籍である.
前半では関数の定義,条件分岐,繰り返しなどについて多くの例題をもとに解説されている.
後半ではアルゴリズムを設計する方法と例題が述べられている.

本書では紙面上に実行コードと出力結果のいずれも記載されている.
また,WebページからJupyterNotebook形式で章末問題の解答をダウンロードすることができ独学で学ぶ方にとっても優しい書籍であると感じた.
したがって,基礎的な文法を学んだ上で次の段階に進みたいと思ったときに使用する書籍であると感じた.
本書の内容を理解するとPython初心者がPythonを利用した問題解決の指針を行うために必要な初歩的な知識を得ることができるのではないか.

読者モニターレビュー【 ボルテージ 様(ご専門:制御工学,制御理論,ロボット工学)】

著者が明記している通り,本書はプログラミング言語pythonの文法書ではなく,
pythonでアルゴリズムをどのように実装し,問題解決を行うかについて解説した専門書である.
一方で,実際に流し読みすると,数十年前のプログラミング言語の文法書を彷彿とさせる構成になっている.
本書を購入する場合は,そのあたりを吟味していただきたい.

本書を読んだだけで,アルゴリズムを理解することは難しいと思う.教科書内に記載しているプログラムを実際に実装して,
その実行結果と教科書の解説とを照らし合わせると,理解も深くなるだろう.
また,インタプリタ型プログラミング言語の恩恵もある程度,享受できる.

アルゴリズムを図で理解させるような工夫が一部なされているが,すべてのアルゴリズムに対して,図的な説明があると,読者の理解が進むのではないかと思う.

読者モニターレビュー【 miya 様(ご専門:プログラミング教育)】

プログラミングを学ぶとき、必ずぶつかる壁があります。
初心者向けの本で文法を学んだあと、「次はどこに進めばいいのか」という点です。
学生からは
・文法はどうにか覚えたけど、プログラムが書けるようになった実感が少ない
との声がよく聞かれます。
アルゴリズムと文法が別物と思ってしまう学生も多く、「問題解決をするためにプログラムを作る」ことが学べるこのような本が本当に必要とされていています。

富樫 敦

富樫 敦(トガシ アツシ)

1984.3 東北大学大学院博士課程修了,工学博士
1984.3~1996.3 東北大学電気通信研究所助手・助教授
1995.6~1996.3 英国サセックス大学客員研究員(10ヶ月)
1996.4~2003.3 静岡大学情報学部助教授・教授
2000.4~2003.3 放送大学客員教授
2003.4~2021.3 宮城大学事業構想学群 価値創造デザイン学類 教授
2021.4 ~ 静岡理工科大学情報学部コンピュータシステム学科 教授 (データサイエンス専攻を主に担当)

主な専門は,情報工学,計算機科学 (工学分野),データサイエンス.機械学習(含む深層学習),人工知能,など.
現在,学内外において,データサイエンス・AI・DX人材育成に携わる.また,地域課題を大学の演習テーマに設定し問題解決に当たるなど,地域社会に根ざした産学連携に従事している.

掲載日:2022/05/02

「電子情報通信学会誌」2022年5月号広告

掲載日:2022/04/18

情報処理学会誌「情報処理」2022年5月号広告

掲載日:2022/04/01

「電子情報通信学会誌」2022年4月号広告