https://onecompiler.com/postgresql/

Fakultät

Rekursive definition

Explizite definition

Pseudocode

def factorial(n):
	result = 1
	for i from 1 to n inclusive:
		result = result * i
	return result

PL/pgSQL

UDF Definieren

CREATE [ OR REPLACE ] FUNCTION fun(param INT, ...) RETURNS INT AS
$$ DECLARE
	x INT := ...;
BEGIN
	-- ...
END $$ LANGUAGE plpgsql;

Loop

FOR i IN 1..10 LOOP
	-- ...
END LOOP;

Return value

RETURN ...;

Raise exception

RAISE "message";

Conditional expressions

IF ... THEN
	-- ...
END IF;

Call function

SELECT fun(n);

UDF

CREATE OR REPLACE FUNCTION fac(n INT) RETURNS INT AS
$$ DECLARE
	result INT := 1;
BEGIN
	IF n < 0 THEN
		RAISE 'n must be a non-negative integer.';
	END IF;
	FOR i in 1..n LOOP
		result = result * i;
	END LOOP;
	RETURN result;
END $$ LANGUAGE plpgsql;

Größtmögliche Zahl

DO $$ BEGIN
	FOR i in 1..100 LOOP
	  RAISE NOTICE '%', i;
	  PERFORM fac(i);
	END LOOP;
END $$

Die größtmögliche Zahl n ist 12.

Warum?

Der INT-Typ hat 4 byte = 32 bit. Die Grenzen sind also wie folgt:

Wie kommt man auf die Grenzen?

Die einzelnen bits haben einen Wert von bis . Wegen 2er-Komplement ist der größte Wert negativ (). Der größte positive Wert ist also .

Die Fakultäten von 0 bis 13 sind:

nn!
01
11
22
36
424
5120
6720
75 040
840 320
9362 880
103 628 800
1139 916 800
12479 001 600
136 227 020 800

Da ist 12 die größte Zahl, die keinen Überlauf erzeugt.