-1

コード例は Lua になりますが、質問はかなり一般的なものです。これは単なる例です。

for k=0,100 do

    ::again::
    local X = math.random(100)

    if X <= 30 
    then
    -- do something
    else
        goto again       
    end

end

このコードは、0 から 30 までの 100 個の疑似乱数を生成します。0 から 100 の間で実行する必要がありますが、それらのいずれかが 30 より大きい場合はループを続行しません。

gotoステートメントなしでこのタスクを実行しようとしています。

for k=0,100 do

    local X = 100 -- may be put behind "for", in some cases, the matter is that we need an 'X' variable

    while X >= 30 do --IMPORTANT! it's the opposite operation of the "if" condition above!

        X = math.random(100)

    end

    -- do the same "something" as in the condition above


end

代わりに、このプログラムは目的の値が得られるまで乱数の生成を実行します。一般に、最初の例のメイン ループと条件の間にあるすべてのコードをここに配置します。

理論的には、最初の例と同じことを行いますが、gotos がないだけです。しかし、私はそれについて確信が持てません。

主な質問: これらのプログラム コードは同じですか? 彼らは同じことをしますか?はいの場合、どちらがより高速 (= 最適化されている) ですか? いいえの場合、違いは何ですか?

4

3 に答える 3

1

Goto を使用するのは悪い習慣です。http://xkcd.com/292/をご覧ください

とにかく、私は Lua にはあまり興味がありませんが、これは十分に単純に見えます。

最初のコード: ループを開始して 100 回繰り返します。ループでは、0 から 100 までの乱数を作成します。この数が 30 以下の場合は、それを使って何かを行います。この数が 30 より大きい場合は、実際には破棄して別の乱数を取得します。これは、乱数が 100 個になるまで続きますが、すべてが 30 以下になります。

2 番目のコードは次のように述べています: 0 から 100 までループを開始します。次に、X を 100 に設定します。次に、次の条件で別のループを開始します: X が 30 より大きい限り、X をランダム化し続けます。X が 30 未満の場合のみあなたのコードは終了し、何らかのアクションを実行します。そのアクションを 100 回実行すると、プログラムは終了します。

確かに、どちらのコードも同じことを行いますが、最初のコードでは goto を使用しています。これは、効率に関係なく悪い習慣です。

2 番目のコードはループを使用していますが、それでも効率的ではありません。ループには 2 つのレベルがあり、1 つは疑似乱数生成に基づいているため、非常に非効率的です (CPU は 1 兆回の反復で 30 から 100 の間の数しか生成しないのではないでしょうか?)。その後、物事は非常に遅くなります。しかし、これは最初のコードにも当てはまります。疑似乱数生成に基づく「ループ」があります。

TLDR; 効率について厳密に言えば、どちらか一方が他方よりも効率的だとは思いません。私は間違っているかもしれませんが、同じことが起こっているようです。

于 2013-08-16T13:24:01.340 に答える
0

math.random(lower, upper) を直接使用できます

for k=0,100 do
local X = math.random(0, 30)
end

さらに速く。

于 2013-08-16T13:12:58.430 に答える
0

私が見たように、このコードは同じことを行いますが、goto常に使用することは最良の選択ではありません (どのプログラミング言語でも)。luaの詳細はこちら

于 2013-08-16T13:18:40.790 に答える