斐波那契实现阶乘js_功能与命令式编程。 Java 8中的斐波那契,素数和阶乘

斐波那契实现阶乘js

有多种编程风格/范例,但是两个著名的风格是ImperativeFunctional

命令式编程是最主要的范例,因为几乎所有主流语言(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

斐波那契实现阶乘js

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值