比较下 tak
er 0.17 秒 真的快了不少 不科学啊
perl 17 秒
python 6.5 秒
er- %-module(e).
- -module(tak).
- -mode(native).
- -define(P, io:format).
- -export([tak/3, bm/0, bm_testcase/0]).
- tak(X, Y, Z) ->
- if
- Y >= X -> Z;
- true ->
- tak(
- tak(X - 1, Y, Z),
- tak(Y - 1, Z, X),
- tak(Z - 1, X, Y)
- )
- end
- .
- bm() ->
- lists:foreach(
- fun(_) ->
- {Time, _} = timer:tc(tak, bm_testcase, []),
- TimeSec = Time / 1000000,
- ?P("~p~n", [TimeSec])
- end,
- lists:seq(1, 5)
- )
- .
- bm_testcase() ->
- lists:foreach(
- fun(_) ->
- tak:tak(24, 16, 8)
- end,
- lists:seq(1, 10)
- )
- .
- main(_) ->
- bm(),
- halt().
复制代码 python- use Time::HiRes qw(time);
- $|++;
- bm_tak(5);
- sub bm_tak {
- my $n = shift;
- for ( 0 .. $n ) {
- my ( $i, $x ) = ( 0, time );
- while ( $i < 10 ) {
- tak( 24, 16, 8 );
- $i++;
- }
- print time - $x . "\n";
- }
- }
- sub tak {
- my ( $x, $y, $z ) = @_;
- if ( $y >= $x ) {
- return $z;
- }
- else {
- return tak(
- tak( $x - 1, $y, $z ),
- tak( $y - 1, $z, $x ),
- tak( $z - 1, $x, $y )
- );
- }
- }
复制代码 perl
- import time
- def tak(x, y, z):
- if y >= x: return z
- return tak(tak(x - 1, y, z), tak(y - 1, z, x), tak(z - 1, x, y))
- for k in range(0, 5):
- t = time.time()
- i = 0
- while i < 10:
- tak(24, 16, 8)
- i += 1
- print("%.02f" % (time.time() - t))
复制代码 |