ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 一个复杂问题的求解过程(五)

一个复杂问题的求解过程(五)

原创 Linux操作系统 作者:yangtingkun 时间:2008-03-12 23:57:24 0 删除 编辑

今天在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博客 ” ,链接:http://blog.itpub.net/4227/viewspace-206115/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
暂无介绍

注册时间:2007-12-29

  • 博文量
    1955
  • 访问量
    10355633