Pythonを用い,問題解決を通してその背景にある専門知識も身に付けながら,プログラミングの基礎を習得することを目指す。
現在はプログラミング花盛りである.日本では,2020年度の小学校でのプログラミング教育必修化を皮切りに,中学校,そして高校教育でも必修化する.大学では,数理・データサイエンス・AI教育の強化から,文系理系問わずプログラミング教育を必修化する大学が増えてきた.
本書は,プログラミング教育にうってつけの教科書・演習書である.現在,AI・データサイエンスで一番利用され注目されているプログラミング言語Pythonを採用.執筆にあたり,問題解決を通して,課題の背後にある関連知識も身に付けながら,その解法をアルゴリズムとして思索し,プログラムによって実現するように心がけた.プログラミングの楽しさを引き出し,その素養を涵養できるように工夫した.
プログラミング言語の文法習得には多くの時間を要し,そのプロセスが長すぎると途中で挫折し,本来の目的が成就できない.そこで本書は,細かい文法やプログラミングの枝葉末節を余り気にせずに,味のある問題を解きながら,一気通貫でプログラミングを修得できるように工夫した.
以上の思いを抱いて,8章構成で「問題解決を通してプログラミングを楽しむ」を達成する.総本山8章では,最適化問題をプログラミングにより解決する.その際の重要な概念が,モジュール化,抽象化であり,その具現化であるオブジェクト指向の概念を7章で学ぶ.プログラムはデータ構造と制御フローから成り.2章~4章で修得できる.5章はループ構造,6章は関数である.付録ではPythonのデータ構造・主な関数を中心にまとめた.以下,各章のトピックスを列記する.
1章:探索問題,ソーティング,最短経路問題,最適化問題,計算可能関数
2章:数とf文字列,パッキング・アンパッキング,フェルマーの小定理,ラムダ式による無名関数定義,条件式による閏年判定,偽造硬貨・天秤問題,ユークリッドの互除法,不定方程式と最大公約数,二分法と黄金比,ビット演算による線形時間のじゃんけんプログラム
3章:関数のグラフと図的表現,素数判定,エラーと例外処理,アルゴリズム解析と計算量
4章:代入文の仕組み,参照渡し,データ型,基数による数の表現,選択・挿入ソート,文字列とたぬきの暗号,ツェラーの公式,アリとキリギリス,エラトステネスのふるい,グラフの到達可能性問題,ダイクストラの最短経路法,スタックによる逆ポーランド記法の評価,キューによるラウンドロビン・スケジューリング
5章:ニュートン・ラフソン法,数が作る美,内包表記と繰り返し
6章:関数と再帰,グローバル変数・局所変数,位置引数・キーワード引数・デフォルト値,補助関数,可変長引数,階乗関数,フィボナッチ数列,回文と数でも回文,再帰の効率化
7章:オブジェクト指向プログラミング,クラス定義,継承,イテレータの実装,カプセル化
8章:アルゴリズムと設計戦略,有名人の問題,線形探索,二分探索,貪欲法,動的計画法,コイン問題,ナップザック問題,バケツによる水くみ問題
プログラミングは貴重なアイディアを実現するための強力な武器である。本書ではPythonという人工知能用言語を用い,問題解決を通してその背景にある専門知識も同時に身に付けながらプログラミングの基礎を習得していく。
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
引用・参考文献
索引