Skip to content

tatsuhirotsuchiya/A-Gentle-Introduction-to-Computer-Algorithms

Repository files navigation

image

教養のコンピュータアルゴリズム(土屋達弘著,共立出版,2009)のサポート情報です.

本の紹介

  1. 紹介ページ

  2. 出版社のページ

正誤表

  • 29ページ,最後のアルゴリズムのwhileの条件: 「または,前回のループで交換が起らなかった」->「または,前回のループで交換が起った」

  • 37ページ,演習問題(2), ifの条件:「i番目の要素はxと等しいかxよりも前である」->「i番目の要素はxと等しいかxよりも後である」, 「i番目の要素はxと等しいかxよりも後である」->「i番目の要素はxと等しいかxよりも前である」

  • 107ページ,アルゴリズムの最後にelse部が必要

else  
  NOを出力する;

新しい書き方のプログラム

教科書のプログラムは今でも問題なく動作しますが,JavaScriptも変化しており,新しい書き方や機能が追加されています. 以下に,現在のJavaScriptの仕様に即したプログラムを掲載します. (参考:MDN web docs

一番重要な点は,変数を宣言するためのキーワードvarの代わりに,letを使うようにした点です. 宣言された変数が有効なプログラムの範囲をスコープといいますが,小さい方がプログラムの理解が容易になります. varよりletの方がスコープを小さくできます. 具体的には,letの場合は,ブロックという{}で囲まれた範囲の中で用いられれば,スコープがそのブロックの中に限定されます. また,forに続く( )の部分で用いられた場合は,forループの本体がスコープです. (なお,再代入しない変数にはletではなくconstを使うべきなのですが,覚えることを少なくしたいのでletで代用しています.)

あと,古いJavaScriptでも同様なのですが,記述ミスや誤解を少なくするため,ループの本体や,if構造,if-else構造のステップは, 1文しかなくても,{}で囲んだ方がよいでしょう.

以下,各章からいくつか例を挙げます.

第1章

3ページ

let i = 0;
while (i < 10) {
  document.write('Hello ');
  document.write('World!');
  document.write('<br>');
  i += 1;
}

第2章

13ページ

let x, y;
x = parseFloat(prompt('Celsius?'));
// ファーレンハイト度 = 1.8 * セルシアス度 + 32
y = 1.8 * x + 32;
document.write(x + ' deg C = ' + y + ' deg F');

21ページ

let a = [20, 4, 32, 18, 17];
let max = a[0];
for (let i = 1; i < a.length; i += 1) {
  if (a[i] > max) {
    max = a[i];
  }
}
document.write(max);

(参考)教科書のfor, infor, of で表現できるようになりました.

let a = [20, 4, 32, 18, 17];
let max = a[0];
for (const element of a) {
  if (element > max) {
    max = element;
  }
}
document.write(max);

23ページ. 教科書のプログラムは4行目でmodを明示的に宣言すべきでした. (下ではletで宣言していますが,再代入しないのでconstの方が本当はよいです.)

let x = 51;
let y = 27;
while (y > 0) {
  let mod = x % y;
  x = y;
  y = mod;
}
document.write('Answer: ' + x);

第3章

35~36ページ.教科書のプログラムはiを明示的に宣言すべきでした.

let a = [4, 8, 9, 16, 25, 32, 49, 64, 81, 100];
let x = parseInt(prompt('x?'), 10);
let found = false;
let low = 0;
let high = a.length - 1;
while (low <= high) {
  let i = low + Math.floor((high - low) / 2);
  if (a[i] === x) {
    found = true;
    break;
  }
  if (x < a[i]) {
    high = i - 1;
  } else {
    low = i + 1;
  }
}
document.write(found);i

なお,分かりやすさ優先なら,iは以下のように計算できます(参考.low, highの値が巨大な場合,オーバーフローする危険性あり.)

let i = Math.floor((low + high) / 2);

以降については,適宜追加します.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages