Проверьте, действительно ли вход является числом Фибоначчи

fun isfib(a) =
   findfib(a,1,1)

and
findfib(b,x,y) =
   val z = x + y
   if b <= 1 then true
   else if z > b then false
   else if z = b then true
   else fib(b,y,z)

Я помещаю ввод в программу и рекурсивно пытаюсь выяснить, является ли этот ввод числом Фиби или нет. Я могу рассчитать x-е место fib в отдельной программе в 2 строки. Но эта логика "ввод, проверка, равняется ли Фиб, делать Фиб до бесконечности или обанкротиться", крайне смущает меня. Я также получаю ошибки, такие как "замена AND на ANDALSO" и "вставка ORELSE" в строке 7.1, которая B<=1

1 ответ

Решение

Я имею в виду, что вы должны использовать and для случаев, когда вам нужна взаимная рекурсия, в этом случае не похоже, что вы действительно делаете это, например, вы можете попробовать что-то вроде этого:

fun fib 0 = 1
    | fib 1 = 1
    | fib n = (fib (n-1)) + (fib (n-2));

fun isfib a = 
    let
        fun eval a b = if a = (fib b) then true else if a < (fib b) then false else eval a (b+1)
    in
        eval a (1)
end;

Попробуйте запустить isfib 5 а также isfib 6 например. Не требуется бесконечность.

Другие вопросы по тегам