blob: 0fa2b07521bb4b701720a2ebc61154a8879f6b37 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
CREATE OR REPLACE FUNCTION f_ulam_do_sum( ulam int[] )
RETURNS SETOF int
AS $CODE$
DECLARE
left_index int;
right_index int;
BEGIN
FOR left_index IN 1 .. array_length( ulam, 1 ) LOOP
FOR right_index IN left_index + 1 .. array_length( ulam, 1 ) LOOP
RETURN NEXT ulam[ left_index ] + ulam[ right_index ];
END LOOP;
END LOOP;
RETURN;
END
$CODE$
LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION f_ulam( u int, v int, lim int default 10 )
RETURNS int[]
AS $CODE$
DECLARE
ulam int[];
next_value int;
BEGIN
-- PERFORM array_append( ulam, u );
-- PERFORM array_append( ulam, v );
-- PERFORM array_append( ulam, u + v );
ulam := ulam || u || v || u + v;
WHILE array_length( ulam, 1 ) < lim LOOP
SELECT vv
INTO next_value
FROM f_ulam_do_sum( ulam ) AS sums( vv )
WHERE vv > ulam[ array_length( ulam, 1 ) ]
GROUP BY 1
HAVING COUNT( * ) = 1
ORDER BY vv
LIMIT 1;
ulam := ulam || next_value;
END LOOP;
RETURN ulam;
END
$CODE$
LANGUAGE plpgsql;
|