如何在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的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:
如何在ABAP里用函数式编程思想打印出非波拉契Fibonacci(数列)的更多相关文章
- Scala 函数式编程思想
Spark 选择 Scala 作为开发语言 在 Spark 诞生之初,就有人诟病为什么 AMP 实验室选了一个如此小众的语言 - Scala,很多人还将原因归结为学院派的高冷,但后来事实证明,选择 S ...
- 函数式编程思想概述和冗余的Runnable代码
函数式编程思想概述 在数学中,函数就是有输入量.输出量的一套计算方法 相对而言,面向对象过分强调必须通过对象的形式来做事情,而函数式的思想是尽量忽略复杂的面向对象的复杂语法--是强调做什么而不是以什么 ...
- 剑指offer19:按照从外向里以顺时针的顺序依次打印出每一个数字,4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
1 题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印 ...
- JDK 7中的函数式编程思想[转载]
原文作者的观点是Lambda表达式一定会包含在JDK 7中,而全文也着重介绍了这方面的知识,作者认为函数式编程的概念也将出现在JDK 7中. Lambda表达式 Lambda表达式并不是什么新概念,自 ...
- 阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第6节 Lambda表达式_1_函数式编程思想概述
函数式编程和面向对象的区别
- iOS 开发之函数式编程思想(Functional Programming)
函数式编程(Functional Programming), 函数式编程强调的函数:1.不依赖外部状态:2.不改变外部状态. 函数式编程可解决线程安全问题,每一个函数都是线程安全的. 时间状态:变量一 ...
- laravel中closure和curry 科里化函数式编程
推荐值得的一看博客文档:谢谢作者 : https://my.oschina.net/zhmsong 函数式编程curry的概念: 只传递给函数一部分参数来调用函数,然后返回一个函数去处理剩下的参数. ...
- JavaScript之函数式编程思想初探
//result = 3*x + 5; var Mul3 = function(x){ return 3*x; } var Add5 = function(x){ return x + 5; } va ...
- Python3 编程第一步_斐波纳契数列_连续赋值
# Fibonacci series: 斐波纳契数列 # 两个元素的总和确定了下一个数 a, b = 0, 1 while b < 10: print(b) a, b = b, a+b # 1 ...
随机推荐
- eclipse项目从编程到打jar包到编写BashShell执行
eclipse项目从编程到打jar包到编写BashShell执行 一.创建Java项目,并编写项目(带额外jar包) 二.打jar包 三.编写BashShell执行 其中一以及二可以参考我的博客 Ec ...
- Kafka入门之生产者消费者测试
目录: kafka启动脚本以及关闭脚本 1. 同一个生产者同一个Topic,两个相同的消费者相同的Group 2. 同一个生产者同一个Topic,两个消费者不同Group 3. 两个生产者同一个Top ...
- 4 pyspark学习---RDD
开始新的东西,其实很多操作在第二篇的时候就有所介绍啦.在这里继续学习一遍加深一下印象. 1关于RDD (1) RDD-----Resilient Distributed Dataset,弹性分布式数据 ...
- 20个Flutter实例视频教程-第12节: 流式布局 模拟添加照片效果
视频地址: https://www.bilibili.com/video/av39709290/?p=12 博客地址: https://jspang.com/post/flutterDemo.html ...
- webstrom打开多个项目,webstrom常用快捷键
1.webstrom打开多个项目 默认情况下一次只能打开一个项目,如果需要打开多个就按照下面的方法 File -> settings -> Directories -> Add Co ...
- lightoj 1422【区间DP·分类区间首元素的情况】
题意: 给你n天分别要穿的衣服种类,可以套着穿, 一旦脱下来就不能再穿,求n天至少要几件. 思路: 区间DP dp[i][j]代表i到j需要至少几件衣服 第i天的衣服在第i天穿上了,dp[i][j]= ...
- hdu3257【模拟】
题意: 从案例找: 思路: 就是16进制,然后到2进制= =.就是个模拟= =.注意格式: #include <bits/stdc++.h> using namespace std; ty ...
- hdoj2577【多种状态】(简单DP)
#include <stdio.h> #include <iostream> #include <sstream> #include <string.h> ...
- Unity5.0 EventSystem事件系统的详细说明
http://www.manew.com/blog-56596-2917.html?_dsign=53b25d5d unity5.0开发了新的UI系统UGUI,附带的事件系统EventSystem不仅 ...
- 我叫mt3.0更新公告
1.增加卡牌: (1)炮姐,种族:牛头人,职业:元素萨满,可在任务中使用万能碎片兑换,最多兑换5张: (2)娘子,种族:德莱尼人,职业:治疗萨满,进化材料为死亡视察者: 详情点击查看>>& ...