前回「pythonで完全数を求める」という投稿をしましたが、私、統計解析に強いと言われているプログラミング言語「R」も少し勉強しています。その練習も兼ねて、同じプログラムをRで書いてみました。同じプログラムをpythonとRの両方で書いてみることで、コマンドや書式の違いを比較できるのではないかと思います。pythonからRに移植するときのポイントも最後に書いていますので、ぜひご覧ください。
ではまず、Rの方から。
for (n in 2:10000) {
x<-1
for (i in 2:(n^0.5)) {
if(n/i==floor(n/i)) {
x<-append(x,floor(i))
if(n/i!=i){
x<-append(x,floor(n/i))
}
}
}
sx<-0
for (i in 1:length(x)) {
sx<-sx+x[i]
}
if (sx==n) {
print(n)
}
}
次に、前回載せたpythonのプログラムです。
for n in range(2,10000):
x=[1]
for i in range(2,int(n**0.5+1)):
if n/i==int(n/i):
x.append(int(i))
if n/i!=i:
x.append(int(n/i))
sx=0
for i in range(len(x)):
sx==sx+x[i]
if sx==n:
print(n)
pythonからRに移植したときに引っかかったポイントを挙げてみます。私のような初心者がつまずきやすいところかと思いますので、参考になればと思います。
- forループの回数を指定するとき、Rでは指定した最大値を含むが、pythonでは含まない。
上記のプログラムの1行目を例にすると、
(python) nが2から9999まで変化する(10000にはならない)
(R) nが2から10000まで変化する - forループの範囲指定の値は、Rでは整数型にしなくても大丈夫だが、pythonでは整数型にする必要がある。
- Rでは、代入演算子は”=”ではなく”<-“を使う。
(ほかのプログラミング言語でも代入には”=”を使うことが多いので、
慣れないかもしれません。) - 配列(行列)に要素を追加するappendの使い方
(python)x.append(a)
(R)x<-append(x,a)
(代入式にしてやる)
1番目に書いたforループの話ですが、「何回ループさせるか」というだけなら、あまり大きな問題にはならなかったと思います。なぜなら、pythonで
for n in range(10000):
と書いたら、nがゼロから9999まで変化し、ちゃんと10000回ループするからです。今回のプログラムでは、forループの引数を計算に使用しているので、引数が実際にいくつになるかが重要になるわけです(特に3行目)。
いかがでしたか。今回は、同じプログラムをpythonとRの両方で書いて、比較できるようにしてみました。今後、違うプログラムでもやってみたいと思います。