Другие языки программирования и технологии

Как лучше всего оформлять сложные логические выражения?(С помощью булевских операций или с помощью вложенных if)

Что и когда может оказаться предподчительным?
Предположим такая задача:
вывести все 5-тизначные числа без повторяющихся цифр.
Для неё лучше использовать вложенные if, чтобы было меньше сравнений:
10: for n1 := 1 to 9 do
20: __for n2 := 0 to 9 do
21: ____if n1 <> n2 then
30: for n3 := 0 to 9 do
31: __if (n1 <> n3) and (n2 <> n3) then
40: for n4 := 0 to 9 do
41: __if (n1 <> n4) and (n2 <> n4) and (n3 <> n4) then
50: for n5 := 0 to 9 do
51: __if (n1 <> n5) and (n2 <> n5) and (n3 <> n5) and (n4 <> n5) then
60: WriteLn(n1, n2, n3, n4, n5);
Согласись, что применение отсеивания только на последнем шаге (51) в данном случае не целесообразно, хотя возможно:
10: for n1 := 1 to 9 do
20: __for n2 := 0 to 9 do
30: ____for n3 := 0 to 9 do
40: ______for n4 := 0 to 9 do
50: ________for n5 := 0 to 9 do
51: __________if (n1 <> n2) and (n1 <> n2) and (n1 <> n3) and (n1 <> n4) and
52:____________(n1 <>. n5) and (n2 <> n3) and (n2 <> n3) and (n2 <> n4) and
53:____________(n2 <> n5) and (n3 <> n4) and (n3 <> n5) and (n4 <> n5) then
60: WriteLn(n1, n2, n3, n4, n5);
В данном случае и проверок нужно производить больше и лишние циклы появляются.. .

Бывают случаи, когда условие нужно вынести из цикла, что влечёт за собой увеличение программного кода, но этим увеличиваем быстродействие.
К примеру:
было
for i := 1 to n do
__if Z > 5 then
____S := S + A[ i ]
__else
____S := S - A[ i ];
станет
if Z > 5 then
__for i := 1 to n do S := S + A[ i ]
else
__for i := 1 to n do S := S - A[ i ];

Это тривиальный пример, но на практике встречается очень часто.

Бывают случаи, когда ни куда не денешься, и логическое выражение приходится выполнять внутри циклов...
ДН
Денис Назаров
66 531
Лучший ответ