• 如何在ABAP里用函数式编程思想打印出非波拉契Fibonacci(数列)


    在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 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 = 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的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:

  • 相关阅读:
    OLT配置学习
    notepad配合正则表达式处理文本
    利用expect和sshpass完美非交互性执行远端命令
    yum 数据库报错与重构
    杀死dialog
    OLT配置说明
    freeradius下发限速信息字段
    debug调试日志和数据查询
    通过windows的超级终端连接华为交换机
    强制清除交换机端口所有配置
  • 原文地址:https://www.cnblogs.com/sap-jerry/p/9818920.html
Copyright © 2020-2023  润新知