*&---------------------------------------------------------------------*
*& Report  zabc
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT zabc.

TYPES BEGIN OF ty_num.
TYPES  num TYPE i.
TYPES END OF ty_num.

DATA gt_num TYPE TABLE OF ty_num.
DATA gt_stack TYPE TABLE OF ty_num.

DATA gv_target_num TYPE VALUE 20.

PERFORM frm_initialize."可以任意数字组合

SORT gt_num BY num."算法优化,务必排序。

PERFORM lookup USING 0.
*&---------------------------------------------------------------------*
*&      Form  frm_initialize
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM frm_initialize.
  DATA ls_num TYPE ty_num.

  DO 20 TIMES.
    ls_num-num = sy-index.
    APPEND ls_num TO gt_num.
  ENDDO.
ENDFORM.                    "frm_initialize
*&---------------------------------------------------------------------*
*&      Form  lookup
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->SY-TABIX   text
*----------------------------------------------------------------------*
FORM lookup USING pv_tabix.
  DATA ls_num TYPE ty_num.
  DATA lv_index TYPE i.
  DATA lv_tabix TYPE i.

  lv_index = pv_tabix + 1.

  DATA lv_lines TYPE i.

  DESCRIBE TABLE gt_num LINES lv_lines.

  LOOP AT gt_num INTO ls_num FROM lv_index.
    lv_tabix = sy-tabix.

    PERFORM push USING ls_num.

    DATA lv_num TYPE i.

    PERFORM get_count USING lv_num."取组合中数字的累计值

    IF gv_target_num = lv_num.
      PERFORM write.
    ENDIF.

    IF gv_target_num < lv_num."组合值大于目标值,不用再递归,因为值越加越大

    ELSE.
      PERFORM lookup USING lv_tabix.
    ENDIF.

    PERFORM popup.

    "  ENDIF.
  ENDLOOP.
ENDFORM.                    "recurs

*&---------------------------------------------------------------------*
*&      Form  push
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->PS_NUM     text
*----------------------------------------------------------------------*
FORM push USING ps_num.
  APPEND ps_num TO gt_stack.
ENDFORM.                    "push
*&---------------------------------------------------------------------*
*&      Form  write
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM write.
  FIELD-SYMBOLS <ls_num> TYPE ty_num.

  LOOP AT gt_stack ASSIGNING <ls_num>.
    AT FIRST.
      WRITE: / <ls_num>-num.
      CONTINUE.
    ENDAT.

    WRITE <ls_num>-num.
  ENDLOOP.
ENDFORM.                    "write

*&---------------------------------------------------------------------*
*&      Form  popup
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM popup.
  DATA lv_lines TYPE i.

  DESCRIBE TABLE gt_stack LINES lv_lines.

  DELETE gt_stack INDEX lv_lines.
ENDFORM.                    "popup
*&---------------------------------------------------------------------*
*&      Form  GET_COUNT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM get_count USING pv_num.
  FIELD-SYMBOLS <ls_num> TYPE ty_num.

  CLEAR pv_num..

  LOOP AT gt_stack ASSIGNING <ls_num>.
    pv_num = pv_num + <ls_num>-num.
  ENDLOOP.

ENDFORM.                    " GET_COUNT

posted on 2020-08-15 22:29  北上  阅读(249)  评论(0编辑  收藏  举报