Pythonの再帰関数で階乗を求めるプログラムを作る

開発環境はWindows7 Professional(32bit) + ActivePython 2.7.10.12(Python 2.7.10)

昔、読んでいたC言語の入門の本に書いてあった再帰関数で階乗を求めるプログラムの構造を思い出しながら、Pythonで書いてみました。

def kaijyo(n):
	if n ==0 or n == 1:
		return 1
	else:
		return n * kaijyo(n-1)

print(kaijyo(9)) # 362880

Pythonでマージソートを書く

開発環境はWindows7 Professional(32bit) + ActivePython 2.7.10.12(Python 2.7.10)


マージソートとは、ソートの一種で、数列を分割して、それぞれをソートして、最後に、分割されたファイルを比較しながら、1つに統合していくアルゴリズムです。

arr = [5,9,2,4,8,6,1,3,7]
ar1 = arr[0::2]
ar2 = arr[1::2]


# メソッドを作ったが、作らずに、list.sortメソッドで良い。
def st(ar1):

	dummy = None
	while True:

		flug = True

		for i in range(len(ar1)):
			if i < len(ar1)-1 and ar1[i] > ar1[i+1]:
				dummy = ar1[i+1]
				ar1[i+1] = ar1[i]
				ar1[i] = dummy
				flug = False

		if flug == True:
			break

	return ar1

def merge(ar1,ar2):
	ar1 = st(ar1) # ar1.sort()でも良い
	ar2 = st(ar2) # ar2.sort()でも良い
	ar3 = []

	num = len(ar1)

	if len(ar1) >= len(ar2):
		num = len(ar2)

	while True:
		
		if len(ar1) == 0 and len(ar2) == 0:
			break

		elif len(ar1) == 0 or len(ar2) == 0:
			if len(ar1) == 0:
				ar3.append(ar2[0])
				del ar2[0]
			else:
				ar3.append(ar1[0])
				del ar1[0]
		else:

			if ar1[0] < ar2[0]:
				ar3.append(ar1[0])
				del ar1[0]
			else:
				ar3.append(ar2[0])
				del ar2[0]

	return ar3

print(merge(ar1,ar2)) # [1, 2, 3, 4, 5, 6, 7, 8, 9]

Perlでエラトステネスの篩(ふるい)を用いる。

開発環境はWindows 7 Professional(32bit)+Perl 5.24.0。

エラトステネスの篩(ふるい)とは素数を求めるアルゴリズムです。素数を入れる配列を用意して、最初は無条件に2を入れて、次に、現在の値に対して、素数を入れた配列の要素で次々と割っていき、1回も割れなければ、素数として、配列に新たに追加します。

これを繰り返すことで、ある数までの素数を導き出します。
後になればなるほど、配列の要素数がどんどん増えていくので、素数かどうか導き出すまでに時間がかかります。

今回は、100までの素数をすべて表示するプログラムを作りました。

use strict;
use warnings;

my $num = 100;

my @arr = ();

my $flug = 1;

for(my $i = 2; $i <= $num; $i++){

	$flug = 1;

	if($i == 2){
		print $i." ";
		push(@arr, $i);
	}
		for(my $j = 0; $j < @arr; $j++){

			# 1回でも割れたらアウト
			if($i % $arr[$j] == 0){
				$flug = 0;
				last;
			}

		}

		if($flug){
				print $i." ";
				push(@arr, $i);
		}
}

素数の個数を調べてみると、
10までに4個
100までに25個
1000までに168個
10000までに1229個
100000までに9552個
と、どんどん全体の内の比率が小さくなっていきます。

Perlでユークリッドの互助法を用いる。

開発環境はWindows 7 Professional(32bit)+Perl 5.24.0。

ユークリッドの互助法とは、2つの自然数の最大公約数を求めるアルゴリズムです。

aとbの2つの自然数があって(a≧b)、aをbで割り、出現した余りをxとします。今度は、bをxで割り、出現した余りをx´とします。そして、今度は、xをx´で割り、出現した余りをx´´とします。これを、2つの数が割り切れるまで繰り返して、その時の「わる数」の部分が2つの自然数の最大公約数となります。

use strict;
use warnings;

my $a = 42;
my $b = 30;

print(ea($a,$b));


sub ea{
	my ($a,$b) = @_;

	my $dummy = 0;

    # $bの方が数値が大きい場合は入れ替える
	if($a < $b){
		$dummy = $b;
		$b = $a;
		$a = $dummy;
	}

		while($a % $b != 0){
			$dummy = $a % $b;
			$a = $b;
			$b = $dummy;
		}

	return $b;
}

上記の場合、42と30の最大公約数は6なので、結果は6と表示されます。最初、returnするのを$aと書いていたので、12が表示されて、おかしいな?と思い、$bをreturnすると6と表示されたので、こっちかと修正しました。

もし、同じ自然数だった場合は、その数が最大公約数となります。例えば、42同士だったら、42が最大公約数です。

はてなブログでソースコードをシンタックスハイライトする方法と注意点

はてなブログソースコードを貼り付ける際に、見栄えを良くするために、シンタックスハイライトというソースコードに色を装飾する方法がありますが、その方法と注意点を書いておきます。

 

1.はてなブログの記事の編集画面から、編集見たままというタブの右側にある下向きの矢印をクリックすると、はてな記法Markdownがあるので、どちらかを選択します。

 

f:id:k01ken:20171013182432p:plain

 

 2.はてな記法の場合は、

>|言語名|

 ||<

 という風に書きます。言語名の部分は、perlを使うなら、perlと入力して、このブロック内に書いたソースコードをコピペします。

Markdownの場合は、

```言語名

```

 という風に書きます。言語名の部分は、perlを使うなら、perlと入力して、このブロック内に書いたソースコードをコピペします。

 

注意点として、一度、編集見たままで、投稿してしまうと、後から、編集しようと思ったときに、はてな記法Markdownが表示されないので、ソースコードシンタックスハイライトをする場合は、記事自体を削除するか、新しい投稿しなければなりません。

 

【参考】

ソースコードを色付けして表示する(シンタックスハイライト) - はてなブログ ヘルプ

はてなブログでソースコードを記載する。(シンタックスハイライト) - kharuka2016のブログ

 

 

 

 

 

Perlで相関係数を求めるプログラムを作る。

開発環境はWindows 7 Professional(32bit)+Perl 5.24.0。

相関係数は、2つのデータの共分散を、各データの標準偏差の掛け算で割って求めます。調べたいデータのまとまりを、それぞれ配列に入れて、それぞれに対して、共分散と、標準偏差を求めています。下記の2つの配列の場合、それぞれ同じデータが入っているので、結果は1となります。

use strict;
use warnings;

my @data1 = (73.3,74.3,69.0,53.0,75.4,72.4,48.9,65.7);
my @data2 = (73.3,74.3,69.0,53.0,75.4,72.4,48.9,65.7);

print (covarience(\@data1,\@data2) / (s_d(\@data1) * s_d(\@data2)));

# 標準偏差を求めるプログラム
sub s_d{

my $e_data1 = 0; # data1の平均値

my $d_data1 = 0; # data1のある1つのデータの偏差

my $v_data1 = 0; # data1のある1つのデータの分散

my $a1 = shift;

my @data1 = @$a1;

    for(my$i=0;$i<@data1;$i++){
        $e_data1 += $data1[$i];
    }
        $e_data1 = $e_data1 / @data1;

    for(my$i=0;$i<@data1;$i++){
        $d_data1 = $data1[$i] - $e_data1;
        $v_data1 += $d_data1 * $d_data1;
    }

    return sqrt($v_data1 / @data1);
}

# 2つの同じ数のデータ配列を入力したら共分散を返すプログラム
sub covarience{

my $e_data1 = 0; # data1の平均値
my $e_data2 = 0; # data2の平均値

my $d_data1 = 0; # data1のある1つのデータの偏差
my $d_data2 = 0; # data2のある1つのデータの偏差

my $c_data = 0; # 二つのデータの共分散

my($a1,$a2) = @_;

my @data1 = @$a1;
my @data2 = @$a2;

if(@data1 != @data2){ return -1; }

    for(my$i=0;$i<@data1;$i++){
        $e_data1 += $data1[$i];
        $e_data2 += $data2[$i];
    }

    $e_data1 = $e_data1 / @data1;
    $e_data2 = $e_data2 / @data2;

    for(my$i=0;$i<@data1;$i++){
        $d_data1 = $data1[$i] - $e_data1;
        $d_data2 = $data2[$i] - $e_data2;
        $c_data += $d_data1 * $d_data2;
    }

    return $c_data / @data1;

}

TensorFlowを導入する

TensolFlowとは機械学習のためのGoogleが提供しているライブラリのことです。

ディープラーニングを自分で使ってみたいので導入することにしました。

今までは、ディープラーニングに対応したライブラリを使おうとすると、LinuxMacしかダメだったので敬遠してたのですが、改めて調べてみると、TensorFlowの場合は、Windowsでも使えるみたいでした。

自分の環境はWindows 7 Professional(32bit)。

 

  1. 公式サイトへアクセスする。
  2. ページ上部のInstallと書かれたテキストリンクをクリック
  3. 自分の場合は、OSはWindowsなので、Installing TensorFlow on Windowsと書かれたテキストリンクをクリック。Windows上でPython版のTensorFlowに対応しているのは、バージョンが3.5.xか3.6.xのみらしいです。しかも、64bitしかダメみたいで、結局、断念することにしました。くそったれ!!!