功能与命令式编程。 Java 8中的斐波那契,素数和阶乘
有多种编程风格/范例,但是两种著名的风格是Imperative和Functional 。
命令式编程是最主要的范例,因为几乎所有主流语言(C ++,Java,C#)都在推广它。 但是在最近几年中,函数式编程开始受到关注。 主要驱动因素之一是,仅所有新计算机都带有4、8、16或更多核,并且以命令式方式编写并行程序以利用所有核非常困难。 功能风格将这种困难转移到了运行时级别,并使开发人员摆脱了繁琐且容易出错的工作。
等待! 那么这两种样式有什么区别。
命令式编程是一种范例,您可以在其中说明如何准确地执行机器/运行时语句以及应该执行哪些准确的语句以达到所需的结果。
函数式编程是声明性编程范式的一种形式,您可以在其中声明要实现的目标,而机器/运行时将确定最佳的实现方式。
功能风格将方式部分移至运行时级别,并帮助开发人员专注于哪一部分。 通过抽象如何部分我们可以写出更好的可维护性和可扩展的软件。
为了应对多核计算机带来的挑战并保持对开发人员的吸引力, Java 8引入了紧随其后的功能范式。
有足够的理论,让我们使用Java来实现命令式和函数式编程中的几个编程难题,然后看看它们之间的区别。
斐波那契数列命令式与功能性 (斐波那契数列是数字的序列:1、1、2、3、5、8、13、21、34,…。下一个数字是通过将前面的两个数字相加而得出的。)
斐波那契数列的迭代式和命令式
public static int fibonacci(int number) {int fib1 = 1;int fib2 = 1;int fibonacci = fib1;for (int i = 2; i < number; i++) {fibonacci = fib1 + fib2;fib1 = fib2;fib2 = fibonacci;}return fibonacci;
}for(int i = 1; i <= 10; i++) {System.out.print(fibonacci(i) +" ");
}
// Output: 1 1 2 3 5 8 13 21 34 55
正如你可以在这里看到我们的重点是如何 (迭代状态)很多,而这正是我们想要实现的。
斐波那契数列的迭代式和函数式
IntStream fibonacciStream = Stream.iterate(new int[]{1, 1},fib -> new int[] {fib[1], fib[0] + fib[1]}).mapToInt(fib -> fib[0]);fibonacciStream.limit(10).forEach(fib -> System.out.print(fib + " "));
// Output: 1 1 2 3 5 8 13 21 34 55
相反,你可以在这里看到我们的重点是我们要达到的目标 。
质数命令式与功能性素数(质数是大于1的自然数,除1本身以外没有正除数。)
命令式素数
public boolean isPrime(long number) { for(long i = 2; i <= Math.sqrt(number); i++) { if(number % i == 0) return false; } return number > 1;
}
isPrime(9220000000000000039L) // Output: true
再次,我们在此重点关注如何 (迭代,状态)。
功能风格的素数
public boolean isPrime(long number) { return number > 1 && LongStream.rangeClosed(2, (long) Math.sqrt(number)) .noneMatch(index -> number % index == 0);
}
isPrime(9220000000000000039L) // Output: true
在这里我们再次的重点是我们要达到的目标 。 函数式样式帮助我们抽象出了在数字范围内进行显式迭代的过程。
您现在可能会想,嗯,这就是我们所能拥有的一切……。 ? 让我们看看如何以功能风格使用所有核心(获得并行性)。
public boolean isPrime(long number) { return number > 1 && LongStream.rangeClosed(2, (long) Math.sqrt(number)).parallel() .noneMatch(index -> number % index == 0);
}
isPrime(9220000000000000039L) // Output: true
而已! 我们只是将.parallel()添加到流中。 您可以看到库/运行时如何为我们处理复杂性。
阶乘命令式与函数式 (n的阶乘是所有小于或等于n的正整数的乘积。)
迭代式和命令式的阶乘
public long factorial(int n) {long product = 1;for ( int i = 1; i <= n; i++ ) {product *= i;}return product;
}
factorial(5) // Output: 120
迭代和功能风格的阶乘
public long factorial(int n) {return LongStream.rangeClosed(1, n).reduce((a, b) -> a * b).getAsLong();
}
factorial(5) // Output: 120
值得重申的是通过抽象如何部分我们可以写出更好的可维护性和可扩展的软件。
要查看Java 8引入的所有功能特性,请查看以下Lambda表达式,方法参考和流指南。
翻译自: https://www.javacodegeeks.com/2015/12/functional-vs-imperative-programming-fibonacci-prime-factorial-java-8.html
功能与命令式编程。 Java 8中的斐波那契,素数和阶乘相关推荐
- 斐波那契数列112358c语言编程,c语言中的斐波那契数列
本文概述 C中的斐波那契数列:对于斐波那契数列,下一个数字是前两个数字的和,例如0.1.1.2.3.5.8.13.21等.斐波那契数列的前两个数字为0和1. 编写fibonacci系列程序的方法有两种 ...
- 斐波那契实现阶乘js_功能与命令式编程。 Java 8中的斐波那契,素数和阶乘
斐波那契实现阶乘js 有多种编程风格/范例,但是两个著名的风格是Imperative和Functional . 命令式编程是最主要的范例,因为几乎所有主流语言(C ++,Java,C#)都在推广它. ...
- 事无巨细说Java之---Java 程序 | Java 编程实例--1)Java中的斐波那契数列--Fibonacci series
在斐波那契数列中,下一个数是前两个数的和,例如 0.1.1.2.3.5.8.13.21.34.55 等.斐波那契数列的前两个数是 0 和 1. java中写斐波那契数列程序有两种方式: 不使用递归的斐 ...
- Python中的斐波那契数列
你好,Python 爱好者! 在本Python 教程系列的最后一节中,我们讨论了在 Python 中解决 问题的递归方法并通过一些示例对其进行了理解.在本文中,我们将更进一步.我们将在 Python ...
- Java数据结构与算法---斐波那契数列Fibonacci
Java数据结构与算法-斐波那契数列Fibonacci 原理都很简单,直接上代码: package cn.m_fibonacci;public class Fibonacci {public stat ...
- 如何在excel中创建斐波那契数列
斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为"兔子数列" ...
- lwy梦境中的斐波那契数列——诈骗签到题
链接:登录-专业IT笔试面试备考平台_牛客网 来源:牛客网 题目描述 lwy又在说梦话了!在梦境中,他遇到了一个和现实生活中不一样的斐波那契数列! 现实中的斐波那契数列: f(1)=1,f(2)=2f ...
- JAVA中打印斐波拉契数列_java打印斐波那契数列
每行 5 个,输出斐波那契数列的前 20 个数字 6. 编写程序接受用户输入一个... 3 ? 这一公式输出斐波那契数列中的前 40 个数. 保存文件名为:bnds11.java class bnds ...
- java学习笔记之斐波那契数列
斐波那契数列计算公式为: f(n) = f(n-1)+ f(n-2) 基于此写了一个方法,用于输出一个长度为指定的斐波那契数列(从正数1开始, 即1,1 ,2 ,3 ,5 ....): static ...
最新文章
- tpcc-mysql的使用
- 9.1 基于内容的推荐系统-机器学习笔记-斯坦福吴恩达教授
- HTTP 中POST GET 区别
- VMware-server遇到问题的解决
- dot pairs 点_Dott入局欧洲共享单车市场 明年3月伦敦巴黎推出
- 2011年想要惊喜的5z20
- python selenium 环境_配置Python Selenium环境
- 数据挖掘-文本特征提取方法研究
- 从np.random.normal()到正态分布的拟合
- 项目管理必备的软件,实用方便
- balanced-match 源码解析
- 在win7 上安装 Visual Studio 2019 步骤 及 vs2019离线安装包
- 华为nova7se乐活版和华为畅享20se 哪个好
- 你所需要的java基础提升篇大总结
- ML之PDP:基于FIFA 2018 Statistics(2018年俄罗斯世界杯足球赛)球队比赛之星分类预测数据集利用DT决策树RF随机森林+PDP部分依赖图可视化实现模型可解释性之详细攻略
- CSS基础(3)- 选择器
- 微信消息提醒python实现
- 如何用java语言编写小游戏?(贪吃蛇)
- HbuilderX连接小米手机/运行到小程序
- 淘宝商品历史价格接口/商品历史价走势接口代码对接分享
热门文章
- JDK9新特性实战:简化流关闭新姿势
- 人脸登陆facelogin
- 简单解决“无法打开内核设备:\\Global\\vmx86”错误
- java_basic_review(5) java继承
- java转换文本文件到xlsx(自制缓冲区,无需先验文件行数)
- MySQL优化(一):表结构优化
- 怎么清理句柄_JAR文件句柄:混乱后清理!
- java线程池返回线程状态_Java线程的不同状态
- javafx动画_JavaFX动画工具
- 结果集 tostring_关于避免对toString()结果进行解析或基于逻辑的美德