Hello! This is your function:
create or replace function HYPERGEO(
N NUMBER,
K NUMBER,
nn NUMBER,
kk NUMBER
) return NUMBER IS
Res NUMBER;
FUNCTION factorial (b NUMBER) RETURN NUMBER IS
fc NUMBER;
BEGIN
fc := 1;
FOR i IN 2..b LOOP
fc := fc * i;
END LOOP;
RETURN fc;
END;
BEGIN
IF K < kk THEN
RETURN -1;
END IF;
Res := 1;
IF K > kk THEN
Res := Res * factorial (K) / factorial(K - kk) / factorial(kk);
END IF;
IF N - K < nn - kk THEN
RETURN -2;
END IF;
IF N - K < nn - kk THEN
Res := Res * factorial (N - K) / factorial(nn - kk) / factorial(kk);
END IF;
IF N < nn THEN
RETURN -2;
END IF;
IF N > nn THEN
Res := Res / (factorial (N) / factorial(N - nn) / factorial(nn));
END IF;
RETURN(Res);
END HYPERGEO;
--
This is script for testing:
BEGIN
DBMS_OUTPUT.put_line('4, 1, 1, 1 = ' || HYPERGEO(4, 1, 1, 1));
DBMS_OUTPUT.put_line('4, 2, 1, 1 = ' || HYPERGEO(4, 2, 1, 1));
DBMS_OUTPUT.put_line('4, 2, 2, 1 = ' || HYPERGEO(4, 2, 2, 1));
DBMS_OUTPUT.put_line('4, 2, 2, 2 = ' || HYPERGEO(4, 2, 2, 2));
DBMS_OUTPUT.put_line('50, 20, 6, 5 = ' || HYPERGEO(50, 20, 6, 5));
DBMS_OUTPUT.put_line('90, 20, 6, 6 = ' || HYPERGEO(90, 20, 6, 6));
END;
It is a draft, if we agree, I will make error handling and cheking for boundary conditions.
Thank you.