はじめに
なかなか使用しない(私だけ?)PHPでの再帰呼び出し関数を作ってみました。
サンプルソースの概要
数字を英語表記に変更するプログラムです。
英語表記は1〜19までは固有ルールですが、20以降であれば汎用的な流れで処理することが可能です。
この特性を使って、再帰呼び出しで実現してみます。
※今回は100の位までを想定しています。
サンプルソース
hosomitakeshi.php
<?php
// メイン関数呼び出し
yasunorihayashi($argv[1]);
// 再帰呼び出しをするメイン関数
function yasunorihayashi(int $value)
{
if (floor($value / 100) >= 1) {
echo sprintf('%s hundred ', yasunorihayashi(floor($value / 100)));
yasunorihayashi($value % 100);
} elseif (floor($value / 10) >= 2) {
changeX0($value);
echo ' ';
yasunorihayashi($value % 10);
} elseif (floor($value / 10) == 1) {
change1X($value);
} else {
changeX($value);
}
return;
}
// teen
function change1X(int $value)
{
switch ($value % 10) {
case 1:
echo 'eleven';
break;
case 2:
echo 'twelve';
break;
case 3:
echo 'thirteen';
break;
case 4:
echo 'fourteen';
break;
case 5:
echo 'fifteen';
break;
case 6:
echo 'sixteen';
break;
case 7:
echo 'seventeen';
break;
case 8:
echo 'eighteen';
break;
case 9:
echo 'nineteen';
break;
default:
echo 'abeshi';
exit();
}
return;
}
// 10の位
function changeX0(int $value)
{
switch (floor($value / 10)) {
case 2:
echo 'twen';
break;
case 3:
echo 'thir';
break;
case 4:
echo 'for';
break;
case 5:
echo 'fif';
break;
case 6:
echo 'six';
break;
case 7:
echo 'seven';
break;
case 8:
echo 'eigh';
break;
case 9:
echo 'nine';
break;
default:
echo 'abeshi';
exit();
}
echo 'ty';
return;
}
// 1の位
function changeX(int $value)
{
switch ($value) {
case 0:
break;
case 1:
echo 'one';
break;
case 2:
echo 'two';
break;
case 3:
echo 'three';
break;
case 4:
echo 'four';
break;
case 5:
echo 'five';
break;
case 6:
echo 'six';
break;
case 7:
echo 'seven';
break;
case 8:
echo 'eight';
break;
case 9:
echo 'nine';
break;
default:
echo 'abeshi';
exit();
}
return;
}
実行例
実行例
$ php ./hosomitakeshi.php 24
twenty four
$ php ./hosomitakeshi.php 57
fifty seven
$ php ./hosomitakeshi.php 146
one hundred forty six
$ php ./hosomitakeshi.php 457
four hundred fifty seven
$ php ./hosomitakeshi.php 0
$
応用すれば、1000以上の数値も対応することが可能です。
※0は考慮されていなかったり、色々改善点はあります…