首页 > Linux操作系统 > Linux操作系统 > 一个复杂问题的求解过程(五)
今天在PUB里面看到一个帖子:http://www.itpub.net/thread-949571-1-1.html。问题本身并不复杂,不过想借这个问题简单描述一下求解的思路。
这篇仍然使用PL/SQL实现,这里采用了递归算法。
一个复杂问题的求解过程(一):http://yangtingkun.itpub.net/post/468/456641
一个复杂问题的求解过程(二):http://yangtingkun.itpub.net/post/468/456695
一个复杂问题的求解过程(三):http://yangtingkun.itpub.net/post/468/456778
一个复杂问题的求解过程(四):http://yangtingkun.itpub.net/post/468/456864
作为这个系列的最后一篇文章,用递归的算法实现这个功能。
个人感觉,其实使用递归算法要比前一篇通过二维数组实现更容易一些,至少思路上很容易理清楚。
为了在递归调用过程中记录结果,将索引表作为参数传递给过程,另外将递归的实现在过程内部中的命名过程实现,从而使得整个实现可以在一个存储过程中完成。
SQL> CREATE OR REPLACE PROCEDURE P_RESULT AS
2 TYPE T_NUM_TAB IS TABLE OF VARCHAR2(30) INDEX BY BINARY_INTEGER;
3 V_NUM_TAB T_NUM_TAB;
4
5 PROCEDURE P(P_LEVEL NUMBER, P_NUM NUMBER, P_TOTAL NUMBER, P_RESULT_TAB IN OUT T_NUM_TAB) AS
6 V_RESULT NUMBER;
7 V_OUTPUT VARCHAR2(30);
8 BEGIN
9 FOR I IN
10 (
11 SELECT ROWNUM - 1 RN, (ROWNUM - 1) * VALUE VALUE
12 FROM (SELECT VALUE, POWER FROM T WHERE ID = P_LEVEL)
13 CONNECT BY ROWNUM <= POWER
14 ) LOOP
15 V_RESULT := P_TOTAL + I.VALUE;
16 IF P_TOTAL > 16 THEN
17 EXIT;
18 END IF;
19 P_RESULT_TAB(P_RESULT_TAB.COUNT + 1) := P_RESULT_TAB(P_NUM) || ',' || TO_CHAR(I.RN);
20 IF P_LEVEL > 1 THEN
21 P(P_LEVEL - 1, P_RESULT_TAB.COUNT, V_RESULT, P_RESULT_TAB);
22 ELSE
23 IF V_RESULT = 16 THEN
24 V_OUTPUT := LTRIM(P_RESULT_TAB(P_RESULT_TAB.COUNT), ',');
25 SELECT REVERSE(V_OUTPUT)
26 INTO V_OUTPUT
27 FROM DUAL;
28 DBMS_OUTPUT.PUT_LINE(V_OUTPUT);
29 END IF;
30 END IF;
31 END LOOP;
32 END;
33
34 BEGIN
35 V_NUM_TAB(1) := '';
36 FOR I IN (SELECT MAX(ID) ID FROM T) LOOP
37 P(I.ID, 1, 0, V_NUM_TAB);
38 END LOOP;
39
40 END;
41 /
过程已创建。
SQL> SET SERVEROUT ON
SQL> EXEC P_RESULT
2,0,3,0,0
1,1,2,1,0
2,0,2,0,1
0,0,3,0,1
1,1,1,1,1
2,0,1,0,2
0,0,2,0,2
1,1,0,1,2
PL/SQL 过程已成功完成。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/4227/viewspace-206115/ ,如需转载,请注明出处,否则将追究法律责任。