Проверьте, действительно ли вход является числом Фибоначчи
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
например. Не требуется бесконечность.