我想知道是否有任何方法可以产生斐波那契数,而这些斐波那契数在我编写的这个方法中既简单又高效?
WITH d (seq) AS (SELECT LEVEL FROM DUAL CONNECT BY LEVEL < 195) SELECT seq ,fib FROM d MODEL DIMENSION BY(seq) MEASURES(0 AS fib) RULES (fib [1] = 0, fib [2] = 1, fib [seq BETWEEN 3 AND 194] = fib[CV(seq) - 2] + fib[CV(seq) - 1], fib [seq > 194] = NULL) ORDER BY 1 / Execution Plan ---------------------------------------------------------- Plan hash value: 2245903385 --------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 13 | 2 (0)| 00:00:01 | | 1 | SQL MODEL ORDERED | | 1 | 13 | | | | 2 | VIEW | | 1 | 13 | 2 (0)| 00:00:01 | |* 3 | CONNECT BY WITHOUT FILTERING| | | | | | | 4 | FAST DUAL | | 1 | | 2 (0)| 00:00:01 | --------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 3 - filter(LEVEL<195) Statistics ---------------------------------------------------------- 0 recursive calls 0 db block gets 0 consistent gets 0 physical reads 0 redo size 4798 bytes sent via SQL*Net to client 500 bytes received via SQL*Net from client 14 SQL*Net roundtrips to/from client 1 sorts (memory) 0 sorts (disk) 194 rows processed SQL>
注意:LEVEL < 195不是任意选择的,较高的值会使算法失去精度,因此我决定不包括它们,只是为了保持正确的结果。
LEVEL < 195
从简单的角度来看,查询可以依赖于的内置功能(ITERATE ()和ITERATION_NUMBER)MODEL:
ITERATE ()
ITERATION_NUMBER
MODEL
select * from dual model dimension by (0 seq) measures (0 val) rules iterate (195) ( val[iteration_number] = val[iteration_number-1] + val[iteration_number-2], val[2] = 1, val[1] = 0, val[0] = 0 ) ;