Вот частичное решение (в том смысле, что оно пытается воспроизвести Python, а не корректно, используя F #):
open System
let NumberOfTests = Console.ReadLine() |> int
let rec getNewRoot value stack root =
let mutable newRoot = root
let mutable acc = stack
while not (List.isEmpty acc) && (List.head acc) < value do
newRoot <- List.head acc
acc <- List.tail acc
(newRoot, acc)
let CanRepresentBST args baseRoot =
printfn "Passed args: %s" args
let intList = args.Split ' ' |> Seq.map int |> Seq.toList
let rec subfunc rem acc root =
match rem with
| [] -> true
| r :: rs ->
if r < root then
false
else
let (newRoot, newAcc) = getNewRoot r acc root
subfunc rs (r :: newAcc) newRoot
subfunc intList [] baseRoot
printfn "Number of tests: %d" NumberOfTests
let root = Int32.MinValue
printfn "Int min value: %d" root
for _ in 1..NumberOfTests do
let NodeCount = Console.ReadLine()
let Nodes = Console.ReadLine()
printfn "NodeCount: %s" NodeCount
if CanRepresentBST Nodes root then
printfn "YES"
else
printfn "NO"
Я изменил это на интерактивный скрипт fsx, чтобы упростить его тестирование (запустите его с fsi filename.fsx ), но я думаю, что будет довольно легко преобразовать его обратно в скомпилированную программу .
Обратите внимание, что многим (если не большинству) фанатам F # эта программа не понравится из-за функции getNewRoot - там слишком много изменчивости.
Я перенес определение root в конец программы и заставил CanRepresentBST принять его в качестве параметра, чтобы сделать функцию чистой - если вы всегда собираетесь начинать с MinValue в качестве root, вы можете объявить его сверху CanRepresentBST. CanRepresentBST теперь использует вспомогательную подфункцию (бесполезно называемую subfunc), которая принимает параметры для вспомогательного элемента rem списка ввода, acc umulated 'stack' и текущего корневого значения. Затем он рекурсивно обрабатывает список ввода, возвращая false, как и прежде, true в конце списка, или обрабатывая его как обычно с помощью хвостового рекурсивного вызова.
getNewRoot используется для инкапсуляции обновления корневого значения и корректировки накопленного стека.
Обратите внимание, что это достаточно близкий перевод Python, поэтому он так сильно раздувается. Лучше было бы вернуться к сути того, чего вы пытаетесь достичь, и написать что-то новое, используя то, что у вас есть в F #. Если кто-то хочет опубликовать лучшую версию, сделайте это!