如何在ABAP裡用函數語言程式設計思想列印出非波拉契Fibonacci(數列)

i042416發表於2018-09-02

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

在ABAP裡也有很多種方式實現這個需求。

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

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裡用函數語言程式設計思想列印出非波拉契Fibonacci(數列)

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

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 = 0THEN VALUE #( ( |0| ) )WHEN n = 1THEN 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 ) ).

如何在ABAP裡用函數語言程式設計思想列印出非波拉契Fibonacci(數列)

列印輸出:

如何在ABAP裡用函數語言程式設計思想列印出非波拉契Fibonacci(數列)

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


如何在ABAP裡用函數語言程式設計思想列印出非波拉契Fibonacci(數列)

如何在ABAP裡用函數語言程式設計思想列印出非波拉契Fibonacci(數列)


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24475491/viewspace-2213409/,如需轉載,請註明出處,否則將追究法律責任。

相關文章