この記事を読むことで、PythonとGASでforループを使って階乗の計算の仕方を学べます。この記事では5!(5の階乗、5×4×3×2×1=120)を扱います。
また、ループの中で変動する値をトレースするコードも付け加えました。
このコーナーでは、学習コンテンツpaizaラーニングのレベルアップ問題集をPythonとGASの両方で解いて全コードの解説をしています。
PythonとGASの両方のコードを用いて、全コード及び部分的にも可能な限り詳細に記載いたしました。
GASはスプレッドシートを使っています。
GASはGoogle Apps Scriptと言って、JavaScriptの文法をベースにしているので、JavaScriptの学習中の方にもお役立て出来るかも知れません。
paizaレベルアップ問題集でPythonとGASを解いて見たに戻る
メインメニューに戻る
Python自作サンプル
GASサンプル
基本情報技術者試験
paizaでの解答はPythonで行いましたが、この記事ではPythonのコードと共に、同じ問題を現在学習中のGASだったらどう解くのか、スプレッドシートでバインドして作ってみました。
問題:
整数 N が与えられます。
N の階乗 N! を計算して出力してください。
この記事では、下記の入力例2の場合を例にして、5!を求めます。
5の階乗は、5×4×3×2×1=120です。
入力例2
5
出力例2
120
ではまず、Pythonで解いてみます。
今回は、paiza.ioを使って解きます。paiza.ioの使い方はこちらから。
■ Pythonでの解き方 ■
下準備として、paiza.ioにこの様に入力します。
(入力例1をそのままioにコピーしただけ。)
手順として、
1:Nを標準入力で取り込む
2:階乗の計算結果factを1で初期化する
3:ループでfactにfact*=(N-i)を計算する
4:factを表示
で、行います。
まずは、プログラムの各変数の動きを追いやすいように、トレースのio出力結果と、トレースのコードを添えます。
ループの変数iは、0からこの例ですと4まで変動します。
fact=1,i=0の時
fact*=(5-0)
fact=5
fact=5,i=1の時
fact*=(5-1)
fact=20
fact=20,i=2の時
fact*=(5-2)
fact=60
fact=60,i=3の時
fact*=(5-3)
fact=120
fact=120,i=4の時
fact*=(5-4)
fact=120
これで、5!=120が求まりました。
ここまでのトレースのコードを掲載します。
計算結果です。
#標準入力で整数Nを取得する
N=int(input())
#階乗を計算するfactを1で初期化する
fact=1
#ループで階乗の計算をする
print('<<<forループに入ります。>>>')
for i in range(N):
print('計算前のfactは'+str(fact)+'です。')
print(str(fact)+'×「'+str(N-i)+'」を計算します。')
fact*=(N-i)
print('計算後のfactは【'+str(fact)+'】です。')
print('----------------------')
print('<<<forループを抜けました。>>>')
print(fact)
このままでは、出力結果である出力例2に対して冗長なコードが含まれているので、解答以外のprint文をコメントアウトします。
#標準入力で整数Nを取得する
N=int(input())
#階乗を計算するfactを1で初期化する
fact=1
#ループで階乗の計算をする
#print('<<<forループに入ります。>>>')
for i in range(N):
#print('計算前のfactは'+str(fact)+'です。')
#print(str(fact)+'×「'+str(N-i)+'」を計算します。')
fact*=(N-i)
#print('計算後のfactは【'+str(fact)+'】です。')
#print('----------------------')
#print('<<<forループを抜けました。>>>')
print(fact)
スッキリするように、コメントアウトした部分を省いたコードです。
#標準入力で整数Nを取得する
N=int(input())
#階乗を計算するfactを1で初期化する
fact=1
#ループで階乗の計算をする
for i in range(N):
fact*=(N-i)
print(fact)
ioの出力結果です。
■ GASでの解き方 ■
では、同じ問題をGASで解いてみます。
まず、スプレッドシートにこの様に配置しました。
このシートの緑色のセルN=5を取得して、5!を計算し、階乗の計算結果を黄色いセルに格納します。
※スプレッドシートに表示する場合は、一次元配列ではなく、二次元配列としてからの配列に追加をして作成します※
手順はこのようになります。
1:スプレッドシートからアクティブシートをアクセスする
2:スプレッドシートの緑色のセルの整数N(この例では5)を取得する
3:階乗の計算に使用する変数factの初期値を1にする
4:forループで階乗を計算
5:factが計算出来たことをログ出力で確認
6:スプレッドシートに二次元配列として格納する変数fact2を宣言
7:fact2にfactの計算結果を二次元配列になるように追加
8:スプレッドシートに出力前のfact2をログ出力して確認する
9:スプレッドシートの黄色い所に階乗の計算結果を二次元配列として格納したfact2を出力する
手順1: スプレッドシートからアクティブシートをアクセスする
const ss=SpreadsheetApp.getActiveSheet();
ここで定数ssにSpreadsheetAppから階層を辿ってアクティブシートにアクセスしています。
手順2:スプレッドシートの緑色のセルの整数N(この例では5)を取得する
const N=ss.getRange(1,2).getValue();
手順3:階乗の計算に使用する変数factの初期値を1にする
let fact=1;
手順4:forループで階乗を計算
Forループ内をトレースします。
fact=1,i=0の時
fact*=(5-0)
fact=5
fact=5,i=1の時
fact*=(5-1)
fact=20
fact=20,i=2の時
fact*=(5-2)
fact=60
fact=60,i=3の時
fact*=(5-3)
fact=120
fact=120,i=4の時
fact*=(5-4)
fact=120
これで、5!=120が求まりました。
Forループ内のコードを掲載します。
console.log('<<<forループに入ります。>>>');
//forループで階乗を計算
for (let i=0;i<N;i++){
console.log(`計算前のfactは${fact}です。`);
console.log(`${fact}×「${N-i}」を計算します。`);
fact*=(N-i);
console.log(`計算後のfactは【${fact}】です。`);
console.log('--------------------------------');
}
console.log('<<<forループを抜けました。>>>');
手順5:factが計算出来たことをログ出力で確認
console.log(fact);
手順6:スプレッドシートに二次元配列として格納する変数fact2を宣言
let fact2=[];
手順7:fact2にfactの計算結果を二次元配列になるように追加
fact2.push([fact]);
手順8:スプレッドシートに出力前のfact2をログ出力して確認する
console.log(fact2);
手順9:スプレッドシートの黄色い所に階乗の計算結果を二次元配列として格納したfact2を出力する
ss.getRange(2,2).setValue(fact2);
実行後のスプレッドシートです。
GASでの全コードはこちらになります。
function loop2no14() {
//スプレッドシートからアクティブシートをアクセスする
const ss = SpreadsheetApp.getActiveSheet();
//スプレッドシートの緑色のセルの整数N(この例では5)を取得する
const N = ss.getRange(1, 2).getValue();
//階乗の計算に使用する変数factの初期値を1にする
let fact = 1;
console.log('<<<forループに入ります。>>>');
//forループで階乗を計算
for (let i = 0; i < N; i++) {
console.log(`計算前のfactは${fact}です。`);
console.log(`${fact}×「${N - i}」を計算します。`);
fact *= (N - i);
console.log(`計算後のfactは【${fact}】です。`);
console.log('--------------------------------');
}
console.log('<<<forループを抜けました。>>>');
//factが計算出来たことをログ出力で確認
console.log(fact);
//スプレッドシートに二次元配列として格納する変数fact2を宣言
let fact2 = [];
//fact2にfactの計算結果を二次元配列になるように追加
fact2.push([fact]);
//スプレッドシートに出力前のfact2をログ出力して確認する
console.log(fact2);
//スプレッドシートの黄色い所に階乗の計算結果を二次元配列として格納したfact2を出力する
ss.getRange(2, 2).setValue(fact2);
}
宜しかったらコピペしてアレンジして見て下さい。
お疲れ様でした、ブレイクタイムフォトはこちらになります。
癒しの海、房総半島外房、御宿の海。
■ 参考文献の紹介■
じっくり丁寧にPythonを学びたい方向け。
まずはpaizaラーニングなどの学習コンテンツで学んで、基礎をマスターしたら、この本でじっくりと初級から中級レベルを目指せます。
初めてGASを学ぶ方向け。
スプレッドシートの基本的な使い方からGASのベースとなるJavaScriptの基礎文法、GASでの初歩的なプログラミングを学べます。
GASに少し慣れて来たら、基礎固めとリファレンスとしてこの本でじっくり学べます。
paizaレベルアップ問題集でPythonとGASを解いて見たに戻る
メインメニューに戻る
Python自作サンプル
GASサンプル
基本情報技術者試験