0

簡単に思える質問があります。各反復で異なる関数を呼び出す for ループがあります。これらの関数の一部は、特定の条件が成立する場合に最初の反復でのみ使用する必要があります。この問題を解決する方法の 1 つは、関連する関数を呼び出す前に「if」ステートメントで条件を確認することですが、同じ状況の関数が 10 個以上あるため、これを処理する他の方法があるかどうか疑問に思っていますもちろん状態)?例として、次の疑似コードを見てください。

for Iteration < Generation
    ...
    if ('certain condition 01 holds true')
        output = function01(arguments)
    end
    ...
    ...
    if ('certain condition 02 holds true')
        output = function02(arguments)
    end
    ...    
    ...
    if ('certain condition 10 holds true')
        output = function10(arguments)
    end
    ...
 end

たとえば、10000回の反復がある場合、これらの「if」ステートメントのそれぞれを10000回評価する必要があり、計算時間が大幅に増加します。関数の代わりにオブジェクト指向プログラミングとクラスを使用して、より良く、おそらく高速にすることは可能ですか?

4

2 に答える 2

4

常にいくつかの条件をチェックする必要がある場合、それを回避する方法はありません。ただし、最初の2つの条件が最初の500ループでのみ発生することがわかっている場合は、大きなループを2つに分割します。最初の条件は10の条件すべて(500回の反復)で、2番目の条件は8つだけです(合計-500回の反復)。

覚えておくべきもう1つの重要なことはelseif、条件またはcontinueループで使用することです(条件が相互に排他的である場合、これはコードサンプルから推測されます)。このようにして、関連する条件が見つかったら、残りのifステートメントが実行されないようにします。さらに、ループの開始時に最も可能性の高い状態を確認する必要があります。つまり、ほとんどの場合、条件5が最も可能性が高いことがわかっている場合は、最初に条件5を確認する必要があります。ifこのようにして、ステートメントが評価される回数を減らすことができます。

最後に、ステートメントを使用できます。switch複数の条件よりも読みやすくelseif、条件の1つが真の場合、次の条件は自動的に無視されます。

于 2013-01-27T01:16:50.880 に答える
2

クラスとオブジェクト指向についてはわかりませんが、関数内の順序を次のように変更できます。

...
% 'iteration' 1
if (condition1) then
    output = function1(args)
end

if (condition2) then
    output = function2(args)
end
.
.
.
for ix = 2:max
    % code inside loop
end

つまり、ループが開始する前に最初の反復でのみ呼び出されるコードを配置し、次に2番目の反復で開始します。

于 2013-01-27T00:20:43.317 に答える