まず、コードを理解するよりも「◇の○乗とは何か」を理解した方が早いかもしれません。
ここでは nのm乗を n^m
と表現するとします。
このn^mの定義はなんでしょうか。べき乗と呼ばれていて、こちらによると
同じ数をくり返しかけ算したもののことを、累乗と言います。
とありますね。
掛け算としてたとえば 3×10は 3を10回足したものですが、『足したもの』ではなく『かけたもの』がこのべき乗ですね。
ではこのべき乗を計算するときはどのように計算しますか?
たとえば3^10だとどうなるでしょうか。3×3×3×(中略)×3
のように3を10回かけたものです。
では、この計算式を質問者さんはどのように解きますか?
つまり 3^10 はどのように計算しますか?
私ならまず 3×3をします。そして結果は9なのでこの結果をノートかなんかに記録しておく。
そして次の ×3 を 先ほど記録した結果と一緒に計算する。つまり 9×3 = 27ですね。
ということで先ほど記録した数字(9)を(27)に更新する。
さらに ×3 をする。27×3 = 81 なので、先ほど記録更新した (27) を (81)に更新する。
…とこれを最後まで繰り返す。そうすると最終的に3^10の結果が求まる。
記録を X とすると、
X = 3 * 3
X = X * 3
X = X * 3
...
X = X * 3
のようになるはずです。
最初の X = 3 * 3
以外は常に X = X * 3
という式になっています。
で、最初の X = X * 3
も Xの初期値を1と仮定すると X = 1, X = X * 3, X = X * 3
が成り立ちます。
ということは X の初期値を1としていたなら、X = X * 3
という式が成り立つ。
そして今回求めたいのは2^1, 2^2, 2^3, ... 2^7, 2^8
という1乗から8乗までの数列みたいなものですよね。
では、2^1から2^8までを同じく計算してみてください。
2^1 = 2
2^2 = 2 * 2
2^3 = 2 * 2 * 2
2^4 = 2 * 2 * 2 * 2
2^5 = 2 * 2 * 2 * 2 * 2
...
2^8 = 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2
というような計算になるはずです。(面倒なので答えは出しませんが)
よー-------く見てください。
何かに気づきませんか?
そう、『nにm乗するとしたら、m が +1 するごとに n が一つ多くかけられている』ですね。
3^1から3^8とかだと3が一つ多くかけられる…ですけど。
たとえば 2^4 は 2^3 にさらに ×2 した値になっているはずです。
つまり n^m としたら、n^m = { n^(m-1) } * n
という計算式が成り立つ。
an = { 2^1, 2^2, 2^3, ... 2^8 }
という数列とみなすと、前項に ×2 した値になる。
漸化式a(m+1) = am × n
となる。(n^mの数列なのでちょっと変更)
つまり、2^1 が求まっていれば 2^1 にさらに ×2 すれば 2^2 になるし、
2^3 が求まっていれば 2^3 に ×2 をすれば 2^4 が求まる。
どのみち 2^1 から 2^8までをそれぞれ求めるのだから、個別に 2^1 を求めて 2^2 を求めて…とやるよりも
『前項(ひとつ前の値)に2をかけていく』だけで それぞれ求まるのでfor文で一気にやっているのです。
一応 2^1 = 2, 2^2 = 2 * 2, 2^3 = 2 * 2 * 2, 2^4 = 2 * 2 * 2 * 2, ... と一つずつ解いてもいいですが、面倒だし前項に2をかければ求まるのだから…ということです。
『2の段(掛け算九九)を列挙すること』の掛け算ではなくべき乗版ってところでしょうか。