組み合わせ
第四弾のテーマは「組み合わせ」です。
以下は、n個のものからr個を取り出した時の組み合わせの数、という意味の数式です。
高校の数IIでしたっけ?
\({}_{n}C_{r}\)
数式を綺麗に出したかったので、「LaTex1」を使いました。
3個のものから2個取り出すと、その組み合わせの数は以下の数式で計算できます。
\({}_{3}C_{2} = \frac{3\cdot2\cdot1}{2\cdot1} = 3\)
3個のものが\((A,B,C)\)だったとして、組み合わせは以下の3通り。
\( (A,B), (A,C), (B,C) \)
この程度なら、屁でもないですよね!!
これをテーマにしたのは、ループ地獄を体験していただくためです。
早速C++からどうぞ!!
#include <iostream>
using namespace std;
int main()
{
string s = "ABC"; // 3個から2個取り出す組み合わせを計算
int n = s.size();
string a, b;
for (int i = 0; i < n; i++)
{
a = s.substr(i, 1);
for (int j = i + 1; j < n; j++)
{
b = s.substr(j, 1);
cout << "(" << a << "," << b << ")" << endl;
}
}
return 0;
}
import itertools
lt = ["A", "B", "C"]
for pair in itertools.combinations(lt, 2):
print(pair)
実行結果
$ ./a.out
(A,B)
(A,C)
(B,C)
$ python3 combi.py
('A', 'B')
('A', 'C')
('B', 'C')
講評
C++は露骨にループします。pythonはライブラリが充実していてあっという間ですね。
3個から2個取り出すなら、インパクトは少ないです。
でも、1000も10000も…個数が増えた場合、同じアルゴリズムだと、横に横に広がります。
とても書けないです。
また、取り出す個数がループブロックになっている意地の悪さ。
C++もちゃんと書けるんでしょうけど、今回の例だとメンテナンス性が著しく低いです。
一方、pythonでは3行目と5行目をメンテするだけです。これが、天国と地獄の違いでしょうか。
このテーマは、リベンジしたいです。オレまだ本気出してねーし(古いな多分、は●にゃとか)
ライブラリ
itertools --- 効率的なループ用のイテレータ生成関数群このモジュールは イテレータ を構築する部品を実装しています。プログラム言語 APL, Haskell, SML からアイデアを得ていますが、 Python に適した形に修正されています。 このモジュールは、高速でメモリ効率に優れ、単独でも...
注釈等
- LaTex
LaTexはHTMLほどお手軽じゃないけど、学術論文などで利用されている文章フォーマット言語です。(すんごい含みのある紹介の仕方!)数式が美しいとか定評があるようです。詳しい理由はよく知らないです。 ↩︎
私の大学時代、LaTexでレポートを書くことが必須でした。なんでWordじゃダメなの?それが研究室のみんなの口癖でした。gnuplotとか、postscriptとか、vi(vimじゃないただのvi)とか、懐かしいです。研究室はPCの豪華環境禁止みたいな雰囲気で、Windowsも使わせてもらえなかった。というかWindows PCが1台しか無かった。
このフォーマットに指導教官が拘り強くて、Excel, Wordで作れば良いのに、そのおかげでレポート作成が通常の5倍の時間かかった気がします。勿論、Linux環境でemacsだったかな。
今時の大学生は、Windowsダメ先生(もうそんな人いないかも)だとしても、Ubuntu & VSCODEなんだろうなぁ~。わざわざ仮想環境入れてLinux使ってたりして、
あー勝手に羨ましい妄想、若干ディスっている感も否めない。
ともあれ、必要に迫られオジサンになった今これを使おうと。。。
感謝しかないですね笑笑
使い方など以下参考にして下さい。
MathJax-LaTeXの導入方法|数式が表示されないときの対処法【WordPress】ブログを書いていて、数式をきれいに表示したい時はありませんか?WordPressのフリープラグイン「MathJax-LaTeX」を使えば、簡単にきれいな数式が表現できます。この記事では「MathJax-LaTeX」の導入方法と数式が上手く表...
4.1 数式を記述する4.1 数式を記述する
コメント