somemo's diary

プログラマ、雑記、プログラミング関係はLinkから、数式はこっちでまとめていることが多い

【php】アルゴリズムの勉強に必要な知識や設定

最近、アルゴリズムの勉強を始めました。参考書籍はアルゴリズムを学ぼうです。

間違いがけっこうあるので、公式・非公式の正誤表を見てください。

PHPUnitとMakeGoodを使って、写経しています。MakeGoodのテスト時間表示機能があるのでアルゴリズムのすごさを実感できます。

アルゴリズムの勉強に必要な知識や設定

以下の3つです。他にもあると思いますが、これを使いました。

  • intの最大値
  • 指数計算の関数
  • 関数呼び出しのネスト回数の設定

intの最大値

定義済みの定数であるPHP_INT_MAXです。これの値はint(2147483647)です。OSにあわせたPHPによって違うのかもしれませんが、そんなものあるのか聞いたことないです。使う前に必ずCPU使用量やループなどを気にしましょう。

指数計算の関数

powです。ある数のべき乗を計算できます。100の階乗を計算したときの期待値を設定するときに使いました。

<?php
$expected = 9.33262154 * pow(10, 157);

// 9.33262154E+157 ⇒Googleに!100を計算してもらった結果

ちゃんと計算すると結果が違っていて、PHPUnitに怒られました。

Failed asserting that 9.3326215443944E+157 matches expected .

関数呼び出しのネスト回数の設定

最後は、php本体ではなくxdebugの設定です。xdebugにはxdebug.max_nesting_levelという設定があり、無限再帰を防ぐためにデフォルトでネストを100回までに制限しています。以下、原文です。

xdebug.max_nesting_level

Type: integer, Default value: 100

Controls the protection mechanism for infinite recursion protection.

The value of this setting is the maximum level of nested functions that are allowed before the script will be aborted.

この設定値を変更せずに再帰が多い処理を実行すると、以下のエラーが発生します。

Fatal error: Maximum function nesting level of ’100′ reached, aborting!

xdebugは開発環境にしか入れないと思いますので、本番環境で起きたらインストールしているモジュールを調べてみるといいでしょう。