今回は、ループ処理に使われるfor文とwhile文の違いについて書いてみようと思います。
結論から言うと、次のような違いがあります。
for文:指定した回数だけ繰り返す(事前に繰り返す数がわかっている)
while文:ある結果にたどり着くまで繰り返す(事前に繰り返す数がわかっていない)
複利の例がわかりやすいと思いましたので一番下に載せていますが、まずは復習も兼ねてそれぞれのループについて見ていきたいと思います。
for文について
for文=forループは、配列やリストの各要素にアクセスするために使用されます。要素の数だけ繰り返し処理を行うことができます。
const names = ['Ed', 'John', 'Sarah', 'Jenny', 'Mike'];
for (let i = 0; i < names.length; i++) {
console.log(names[i]);
}
namesという配列の各要素をコンソールに表示するコードになります(コンソールには、Ed, John, Sara, Jenny, Mikeの順に表示されます)。
for-ofループとfor-inループについて
for-of:配列の各要素に対して、反復処理する時に使われる
for-in:オブジェクトのプロパティに対して、反復処理する時に使われる
for-ofループの使い方
for-ofループでも同じように抽出することができます。
let 配列の要素を入れる変数 of 配列名として(ここでは let name of names と設定)nameの中に、Ed, John…と順に入っていくイメージです(コンソールには、Ed, John, Sara, Jenny, Mikeの順に表示されます)。
const names = ['Ed', 'John', 'Sarah', 'Jenny', 'Mike'];
// for (let i = 0; i < names.length; i++) {
// console.log(names[i]);
// }
for (let name of names) {
console.log(name);
}
// index番号が知りたい場合:
for (let name of names) {
console.log(names.indexOf(name));
}
また、forEach()メソッドを使うと、配列内の各要素に対して繰り返し同じ処理を実行してくれます(コンソールには、Ed 0, John 1…と名前とインデックスが順に表示されます)。
// ONLY for ALLAYS
names.forEach(function (name, index) {
console.log(name, index);
});
for-ofとforEachの違いは、forEachは配列に対してだけ使えるメソッドである点です。また、for-ofはbreakを使って途中でループを抜けることができますが、forEachは出来ません。
//for-ofでbreakを使ってループを抜ける
for (let name of names) {
if (name === 'Jenny') {
break;
}
console.log(name);
}
//forEachでbreakを使うとエラーが出る
names.forEach(function (name, index) {
if (name === 'Jenny') {
break;
}
console.log(name);
});
for-inループの使い方
for-inループは、オブジェクトのプロパティに対して反復処理をする時に使用されます。
const user = {
name: 'John', // key and value, whole line is property
age: 30,
subsribers: 2000,
money: '$200',
};
for (let x in user) {
console.log(x);
console.log(user[x]);
}
userというオブジェクトのプロパティを一つずつxという変数へ入れていくイメージです。console.log(x);で各キーを取得、console.log(user[x]);で各バリューを取得できます。
このバリューを取得する方法は、単純にプロパティへアクセスする方法と同じ書き方ですね(2番目の方です)↓
console.log(user.name); // John
console.log(user['name']); // John
while文について
let i = 20;
while (i < 30) {
console.log(i);
i++;
}
whileを使うとwhile(条件がTrue)の間は{ }内をループさせることができます。注意点としては、初期値(ここでは、let i = 20;)をループの外へ出しておくこと、また、条件がTrueの間はループが続くので、{ }にループを止めるための式を書いておくことです(ここでは、i++;)。
また、do-whileを使うとwhile(条件がFalse)の場合でも一度だけ処理を実行することができるそうです。
こちらが通常の場合。i = 0なので10より小さいからTrue ↓ コンソールには、0, 1, 2, 3…9と表示されます。
let i = 0;
do {
console.log(i);
i++;
} while (i < 10);
こちらがwhile(条件がFalse)の場合。i = 0なので10より小さいはずですが、大きいと設定しています↓コンソールには、0が表示されます(一度だけ処理され、エラーにはならない)。
let i = 0;
do {
console.log(i);
i++;
} while (i > 10);
初心者には、「こういうのはいつ使うんだろう?」という疑問が起こります。こちらの使い道は後で調べてみようと思います。
for文とwhile文の違い
for文:指定した回数だけ繰り返す(事前に繰り返す数がわかっている)
while文:ある結果にたどり着くまで繰り返す(事前に繰り返す数がわかっていない)
さてここまでわかったところで、一番知りたかったfor文とwhile文の使い分けについてです。
あるブログで、for文とwhile文の違いの例として、「初期投資額1万円を年利5%で運用した場合、10年後にいくらになっているか?」を考える場合には、10年という期間がわかっているのでfor文、「初期投資額1万円が2万円になるのはいつか?」を考える場合には、繰り返す数がわかっていないのでwhile文を使うと良いと書かれていました。
わかりやすいと思ったのですが、そのブログにはコードが書かれてなかったので、ChatGPTに質問しながらまとめました。
まず、元本や年利、複利といった単語の簡単な説明から始めますね。
元本(初期投資額):もともとの投資または預金の金額(ここでは1万円)
年利:利子の金額を計算するための年間の利率(ここでは5%)
単利:毎回一定の利息が発生する(ここでは1万円の5%で500円)
複利:元本に利息が追加されたものに対して、さらに利息が発生する(雪だるま式に増えていく)
例えば単利だと、一年間の利息は500円。これが毎年発生しますので10年だと500円×10年で5,000円。元本と合わせると10年後には15,000円になります。
複利の場合は、次のように1年目は元本に利息を足した10,500円、2年目はその10,500に対して利息が計算され、足されていきます。
1年目:10,000 + (10,000 × 0.05) = 10,500
2年目:10,500 + (10,500 × 0.05) = 11,025
3年目:11,025 + (11,025 × 0.05) =
… 以後、同様に続く
for文を使った複利の計算
では「初期投資額1万円を年利5%で運用した場合、10年後にいくらになっているか?」をfor文を使って書いてみたのがこちらです。
// 初期投資額
const initialAmount = 10000;
// 年利率(5%を0.05と表現)
const annualInterestRate = 0.05;
// 運用期間(10年間)
const years = 10;
// 最終的な合計額を格納する変数
let totalAmount = initialAmount;
// 複利計算を実行するforループ
for (let i = 1; i <= years; i++) {
// 今の年の利息を計算して元本に加える
totalAmount += totalAmount * annualInterestRate;
}
// 最終的な合計額をコンソールに表示
console.log(`運用期間${years}年後の合計額は${totalAmount.toFixed(2)}円です。`);
forループのところ
totalAmount += totalAmount * annualInterestRate;
こちらは、上記の複利のところで計算した、10,000 + (10,000 × 0.05) = 10,500の左辺と右辺を入れ替えた形で、同じですね。
totalAmount += totalAmount * annualInterestRate;
こちらは下のようにも書けますので
totalAmount = totalAmount + (totalAmount * annualInterestRate);
10,500 = 10,000 + (10,000 × 0.05)
運用期間のconst years = 10; のところを変えてみると、3年後には?20年後には?と異なる運用期間の結果を出すことができます。
10年の場合は、『運用期間10年後の合計額は16288.95円です。』とコンソールに表示されました。console.log()内にあるtoFixed(2)は、小数点以下2桁まで表示させるというメソッドです。
while文を使った複利の計算
次に、「年利5%で運用した場合、初期投資額1万円が2万円になるのはいつか?」を考えてみましょう。
//初期投資額;
const initialAmount = 10000;
// 年利率(5%を0.05と表現)
const annualInterestRate = 0.05;
// 目標の預金額
const targetAmount = 20000;
// 年数をカウントする変数
let years = 0;
// 現在の合計額を初期投資額で初期化
let totalAmount = initialAmount;
// 預金額が目標額未満の間、複利計算を続ける
while (totalAmount < targetAmount) {
// 今の年の利息を計算して元本に加える
totalAmount += totalAmount * annualInterestRate;
years++; // 年数を増やす
}
//目標額に達するのに必要な年数をコンソールに表示
console.log(`預金額が${targetAmount}円に達するのは${years}年後です。`);
while (totalAmount < targetAmount) の部分でtargetAmountは20000ですので、20000に達するまでwhileループ内で計算が繰り返されるということになります。
コンソールには『預金額が20000円に達するのは15年後です。』と表示されました。
今回はChatGPTの力を借りて解決しましたが、早く自力で書けるようになりたいなぁと思います。
次はスコープという概念について学びます。