一個考題 , 用一個迴圈印出下列結果

之前有一家公司出的考題 , 用一個迴圈寫出下列結果

*
**
***
****
*****
******
*****
****
***
**
*

我原本是這麼寫的

for($i=1; $i<12; $i++) {
    $n = ($i<6) ? $i:(12-$i);
    echo str_repeat('*' , $n) . "\n";
}

當初這麼個寫法雖然可以跑 , 但沒有仔細考慮到效能問題 , 後來想到應該這麼寫可以更好

for($i=-5 ; $i<6 ; $i++ ) {
    echo str_repeat('*' , 6 - abs($i)) . "\n";
}

當然還有個作弊的方式可以寫出效能更好的 , 就是直接查表法 ...

我自己寫了個效能測試來看看每一種的速度 , 程式碼如下

<?php

function test1() {
	$s = '';
	for($i=1; $i<12; $i++) {
		$n = ($i<6) ? $i:(12-$i);
		$s .= str_repeat('*' , $n) . "\n";
	}
	return $s;
}

function test2() {
	$s = '';
	for($i=-5 ; $i<6 ; $i++ ) {
		$s .= str_repeat('*' , 6 - abs($i)) . "\n";
	}
	return $s;
}

function test3() {
	static $a = array(
		"*\n" ,
		"**\n" ,
		"***\n" ,
		"****\n" ,
		"*****\n" ,
		"******\n" ,
		"*****\n" ,
		"****\n" ,
		"***\n" ,
		"**\n" ,
		"*\n" ,
	);
	$s = '';
	for($i=0; $i<11; $i++) {
		$s .= $a[$i];
	}
	return $s;
}

function performance( $func ) {
	$start_time = microtime(true);
	for($i=0; $i<1000; $i++) {
		$func();
	}
	$ret = $func();
	printf("func %s time: %f ,result : \n%s\n\n", $func , microtime(true) - $start_time ,$ret);
}
performance( 'test1' );
performance( 'test2' );
performance( 'test3' );
?>

輸出結果如下

func test1 time: 0.391411 ,result :
*
**
***
****
*****
******
*****
****
***
**
*

func test2 time: 0.250726 ,result :
*
**
***
****
*****
******
*****
****
***
**
*

func test3 time: 0.201759 ,result :
*
**
***
****
*****
******
*****
****
***
**
*

哈...作弊法雖然是作弊很呆的作法 , 但有時候真的很好用 , 我會不會太處女座了 ... 去測試這些幹嘛

9 則評論在 一個考題 , 用一個迴圈印出下列結果.

  1. 是說..可以用無腦陣列嗎…XD
    $star_int=array(1,2,3,4,5,6,5,4,3,2,1);
    $star=array(1=>’*’,2=>’**’,3=>’***’,4=>’****’,5=>’******’,6=>’******’);
    foreach($star_int as $val)
    {
    echo $satr[$val].”;
    }
    真的還挺蠢的….

  2. Rie :

    是說..可以用無腦陣列嗎…XD
    $star_int=array(1,2,3,4,5,6,5,4,3,2,1);
    $star=array(1=>’*’,2=>’**’,3=>’***’,4=>’****’,5=>’******’,6=>’******’);
    foreach($star_int as $val)
    {
    echo $satr[$val].”;
    }
    真的還挺蠢的….

    其實查表法常常用到~ 我寫的 big5_func 就用到, 以前的版本用算的 , 挺慢的
    也看過有人用查表法取代某些 WIN32 GDI 繪圖指令增加繪圖效能
    有時候最直接的方法最好

  3. 通告: Pigo

發佈留言