2011-09-09 13 views
0

私はそれを26なぜ私のPHPコードは無限ループですか?

  • aaを与えるとき、私はそれを2

  • zを与えるとき、私はそれを1

  • bを与えるとき

    1. aを返す関数GetLettersを持っています私はそれを28

    を与えるとき、基本的にあなたのアイデアを取得したい私は26を超える任意の入力値を供給するとき、それは無限にループしているが、これは私の解決策であることに27

  • abを与えるとき、ありません誰もそれが間違っていることを知っている?

    function GetLetter($amt){ 
        if($amt<=26){ 
         return strtolower(chr(64+$amt)); 
        } 
        $letters=array(); 
        while(true){ 
         $quotient=$amt%26; 
         array_unshift($letters,GetLetter($quotient===0?26:$quotient)); 
         $amt=floor(($amt-1)/26); 
         if($amt===0){ 
          break; 
         } 
        } 
        return implode("",$letters); 
    } 
    
  • +0

    代わりに 'while($ amt!= 0){...}'と言うこともできます。これはint-to-float比較の問題も解決します。 –

    +0

    @Marcは、私は 'しばらく(真)'パターンを好きですが、他の人はもちろん – Pacerier

    +0

    の同意も '後でコードを読むときに、後で特定の条件でブレークの(真の)'としながら、明確ではありません。 'while(true)... break'は、特別な場合にのみ使用してください。これは明らかにそうではありません。 – CodeCaster

    答えて

    4

    hereを参照してください。浮動小数点数を比較しています。試してくださいintval()

    だから私はfloorリターンが浮いて、あなたが===を使用し、ない==整数との比較のために(0)、そうフロート(0)===考える

    if(intval($amt)==0){ 
    
    3

    if($amt===0){ 
    

    を変更int(0)は常にfalseです。ちょうどそれを行うための別の方法として

    2

    (それはO(n)があることにかかわらず、注意してください):

    function getLetters($n) { 
        for ($chr = 'a'; --$n;) ++$chr; 
        return $chr; 
    } 
    

    (あなたがPHPで文字をインクリメントした場合、それは最初a..zから行くよ、その後、aa..zzとあなたが望むのと同じように)

    +0

    もっと良い解決策。一般的には、可能であれば再帰を避けたいと思っています。特に、while(真の)ループを持つ再帰:P –

    1

    whileステートメントのような繰返しステートメントを使用する場合は、floatタイプを使用して繰返しの終わりを判断しないでください。浮動小数点数は決して完全に正確なものではないため、条件ステートメントには理想的ではありません。

    関連する問題