package com.scala.A
import scala.annotation.tailrec
/**
* 递归
* 1)说明
* 一个函数/方法在函数/方法体内又调用了本身,我们称之为递归调用
* 2)案例实操
**/
object scala_function_04 {
//----------------------------------------------------------------------------------------------------------------------
/**
* 入口函数main
**/
def main(args: Array[String]): Unit = {
/**
* 阶乘(循环for,递归)
* 递归算法
* 1) 方法调用自身
* 2) 方法必须要有跳出的逻辑
* 3) 方法调用自身时,传递的参数应该有规律
* 4) scala 中的递归必须声明函数返回值类型
**/
println(test1(3))
println(test2(3))
println(test3(3))
//----------------------------------------------------------------------------------------------------------------------
/**
* scala递归方式计算阶乘的函数test1
* 比如计算5的阶乘,不就是5*4!吗,同理4!=4*3!.....
**/
def test1(i: Int): Int = {
if (i == 1) {
1
} else {
i * test1(i - 1)
}
}
//----------------------------------------------------------------------------------------------------------------------
/**
* scala循环的方式计算阶乘的函数test2
* 1*1=>1*2=>2*3=6
**/
def test2(n:Int):Int={
var res=1
for(i <- 1 to n){
res=res*i
}
res
}
//----------------------------------------------------------------------------------------------------------------------
/**
* Haskell是一种惰性的纯函数式编程语言,里面没有变量,无法循环,如何实现呢?-递归
* 也不是说全部都用递归来写,因为会消费额外资源(耗费更多的栈空间资源,甚至出现栈异常),函数式编程语言计算,对于程序员很友好,但是对计算机不友好,执行效率就会低
* 永远都要耗费这么多资源,那么纯函数编程语言里面是不是有问题?那么有没有上面办法去解决这个问题呢?
* 可以把递归的函数做一个重新设计(尾递归):把递归函数的最后一行返回的只有对于自身的一个调用,没有其他计算
**/
/**
* 尾递归实现方式
* IDEA对于尾递归与递归的解释图标不一样
* java里面可以写出尾递归的形式,但是无效,因为尾递归是争对编译器生效的,只支持函数式编程语言
* */
def test3(n:Int):Int={
/** 这个注解保证代码必须是一个正确的尾递归形式*/
@tailrec
def loop(n:Int,res:Int):Int={
if(n==0){
res
}else{
loop(n-1,res*n)
}
}
loop(n,1)
}
//----------------------------------------------------------------------------------------------------------------------
}
}
/**
* java中实现阶乘的两种方式:循环、递归
* public class DiGui_test {
* public static void main(String[] args) {
* System.out.println(test(5));
* System.out.println(test1(5));
*
* }
*
* //1.循环的方式计算阶乘
* public static int test(int n) {
* int result = 1;
* for (int i = 1; i <= n; i++) {
* result = result * i;
* }
* return result;
* }
*
* //2.递归的方式实现
* public static int test1(int n) {
* if (n == 0) return 1;
* return test1(n - 1) * n;
* //必须要有退出机制
* }
*
* }
* */
//----------------------------------------------------------------------------------------------------------------------
Scala-递归
最新推荐文章于 2023-04-01 06:00:00 发布