Отображение двух максимальных чисел в списке на языке программирования Oz

Мне нужно сделать программу, которая отображает два максимальных числа в списке, используя язык программирования Oz. У меня есть код для печати максимального числа в списке, но мне нужны два самых больших числа. Вот что у меня есть до сих пор:

fun {Max L1}
 case L1
 of nil then 0
 [] X|Xr then
    if X>{Max Xr} then X
     else {Max Xr}
    end
 end
end
{Browse {Max [1 2 3 4 5 6 7 8 9]}}

Это отобразит самое большое число в списке, но только одно, и мне нужно отобразить два самых больших числа. Что мне нужно сделать?


person ahpla    schedule 04.10.2020    source источник


Ответы (1)


В Mozart-Oz есть много способов решить эту проблему. Это одно из возможных решений, которое распространяется на список размером (длиной) N; однако работает только для положительных чисел.

proc {LengL Ls N R}
    case Ls
    of nil then N = R
    [] L|Lr then {LengL Lr N+1 R}
    end
end
proc {Drop1 L Y R}
    R=case L
    of nil then nil
    [] X|Xr then
        if X\=Y then X|{Drop1 Xr Y}
        else {Drop1 Xr Y}
        end
    end
end
proc {MaxN L1 N R1}
    proc {Max1 L R}
        R=case L
          of nil then 0
          [] X|Xr then
              if X>{Max1 Xr} then X
              else {Max1 Xr}
              end
          end
    end
    R2={Max1 L1} Lg={LengL L1 0} in
    R1={proc {$ R}
            R=if N==0 then nil
              elseif N>Lg then R2|{MaxN {Drop1 L1 R2} Lg-1}
              else R2|{MaxN {Drop1 L1 R2} N-1}
              end
       end}
end
{Browse {MaxN [~11 2 3 4 15 6 7 8 9] 12}}

Обратите внимание на поведение MaxN: когда N больше, чем длина списка чисел L1, браузер отображает список длины L1 с первыми N самыми большими числами. Отрицательные числа заменяются нулем. Я надеюсь, что это все еще полезно.

person rbi    schedule 27.11.2020