如何在ABAP裏用函數式編程思想打印出非波拉契Fibonacci(數列)

在JavaScript裏能夠用ES6提供的FunctionGenerator這種黑科技來打印非波拉契數列,具體細節參考我這篇文章app

在ABAP裏也有不少種方式實現這個需求。ui

下面這個report分別用遞歸和ABAP internal table的方式實現了非波拉契數列的打印。code

REPORT Z_FIBO.

PARAMETERS: N type i,

v1 RADIOBUTTON GROUP v default 'X',

v2 RADIOBUTTON GROUP v.

data: f type i,

t type i.

data: product_guid type comm_product-product_guid.

get run time field t.

case 'X'.

when v1\. perform fibonacci using n changing f.

when v2\. perform fibonacci_2 using n changing f.

endcase.

write: / 'Fibonacci(', n, ') =', f.

get run time field t.

write: / 'Runtime', t, 'microseconds'.

*&---------------------------------------------------------------------*

*& Form fibonacci

*&---------------------------------------------------------------------*

form fibonacci using in type i

changing fib type i.

data: f_1 type i, f_2 type i,

n_1 type i, n_2 type i.

case in.

when 0\. fib = 1.

when 1\. fib = 1.

when others.

n_1 = in - 1.

n_2 = in - 2.

perform fibonacci using n_1 changing f_1.

perform fibonacci using n_2 changing f_2.

fib = f_1 + f_2.

endcase.

endform. "fibonacci

*&---------------------------------------------------------------------*

*& Form fibonacci_2

*&---------------------------------------------------------------------*

form fibonacci_2 using in type i

changing fib type i.

data: f_1 type i, f_2 type i,

n_1 type i, n_2 type i,

l type i.

data: fibo type table of i.

append 1 to fibo. " fibonacci(0)

append 1 to fibo. " fibonacci(1)

n_1 = 1.

n_2 = 2.

l = in - 1.

do l times.

read table fibo index n_1 into f_1.

read table fibo index n_2 into f_2.

fib = f_1 + f_2.

add 1 to n_1\. add 1 to n_2.

append fib to fibo.

enddo.

endform. "fibonacci_2

以上兩種解決方案相對來講都比較傳統,再來看看使用ABAP 7.40提供的新關鍵字COND實現的非波拉契數列打印:orm

REPORT z.

CLASS lcl_fibonacci DEFINITION.

PUBLIC SECTION.

TYPES: zint_tab TYPE TABLE OF int4 WITH EMPTY KEY.

METHODS fibonacci

IMPORTING !n TYPE i RETURNING VALUE(fib_numbers) TYPE zint_tab.

ENDCLASS.

CLASS lcl_fibonacci IMPLEMENTATION.

METHOD fibonacci.

fib_numbers = COND #( WHEN n = 0

THEN VALUE #( ( |0| ) )

WHEN n = 1

THEN VALUE #( ( |0| ) ( |1| ) )

ELSE

VALUE #( LET fn1 = fibonacci( n - 1 )

x = fn1[ lines( fn1 ) ]

y = fn1[ lines( fn1 ) - 1 ]

IN ( LINES OF fn1 ) ( x + y ) ) ).

ENDMETHOD.

ENDCLASS.

START-OF-SELECTION.

cl_demo_output=>display( NEW lcl_fibonacci( )->fibonacci( 10 ) ).

打印輸出:遞歸

要獲取更多Jerry的原創技術文章,請關注公衆號"汪子熙"或者掃描下面二維碼: ip

相關文章
相關標籤/搜索