2016-10-06 4 views
0
DECLARE 
    i number(3); 
    j number(3); 
BEGIN 
    i := 2; 
    LOOP 
     j:= 2; 
     LOOP 
     exit WHEN ((mod(i, j) = 0) or (j = i)); 
     j := j +1; 
     END LOOP; 
    IF (j = i) THEN 
     dbms_output.put_line(i || ' is prime'); 
    END IF; 
    i := i + 1; 
    exit WHEN i = 50; 
    END LOOP; 
END; 

コードは正しく動作します。私はそれがどのように動作するのか把握しようとし、素数として4を持つことになりました。このネストされたループの仕組みを理解できるように助けてくれたら、とても感謝しています。PLSQL - この素数コードはどのように機能しますか?

ありがとうございます。

+1

何行目に行きませんか? – OldProgrammer

+0

ありがとう、私の質問に答えます。私はちょっと混乱しましたが、今は明らかです。 – AZ1

答えて

0

i = 4j = 2、条件((mod(i, j) = 0) or (j = i))は、内側のループからの出口につながるが、条件(j = i)は偽とプログラムです具体的には、あなたが理解していないdbms_output.put_line(i || ' is prime');

2

はそれをして書き換えることができますそのビットに簡単:

BEGIN 
    <<outer_loop>> 
    FOR value IN 2 .. 50 LOOP 
    FOR divisor IN 2 .. value - 1 LOOP 
     CONTINUE outer_loop WHEN MOD(value, divisor) = 0; 
    END LOOP; 
    DBMS_OUTPUT.PUT_LINE(value || ' is prime'); 
    END LOOP; 
END; 
/

それは、外側のループに番号があるかどうかをチェックしている数2 ... 50を通って、内側のループで起こっているやっているすべてのその値に正確に分割されます。外部ループを継続する場合には、その数が素数であることを出力しなければならない。

あなたのコードでは、効果的に同じコードですが、それはFOR .. IN ..ループ

2

コードは、外側のループがちょうど2〜iの各値をチェックしている50までのすべての素数を探しているを使用していないことで複雑になっていますその整数が素数かどうかを調べる。 iの各値について

、それは他のすべての整数を一つずつすることによって、その整数を分割しようとし、i場合2から出発して(modがゼロである)なし残りjで割り切れるそれはないプライム。 (j=1)それだけで割り切れる場合を除きます。

jの値がiに分割されるか、またはそれ自体がiに達すると、内部ループが終了します。

さらに、これらの条件のどれが実際に終了するかを確認する必要があります。したがって実際にプライムであるかどうかは問わない。

あなたは少し明確に(私見)ロジックと同じことを行うことができます:私はあなたの質問を理解していれば

BEGIN 
    <<OUTER>> 
    FOR i IN 2..50 LOOP 
    FOR j IN 2..i-1 LOOP 
     IF (mod(i, j) = 0) THEN 
     CONTINUE OUTER; 
     END IF; 
    END LOOP; 
    dbms_output.put_line(i || ' is prime'); 
    END LOOP; 
END; 
/
関連する問題