Scala函数--函数式练习及柯里化函数的概念

16 篇文章 0 订阅

题目一: 用一个for写出一个三角形图案

  def main(args: Array[String]): Unit = {
    for ( i <- 1 to 18 by 2 ; j = (18 - i)/2){
        println(" "*j + "*" *i)
    }
  }

在这里插入图片描述

题目二:逆推 f(10)(20)() 公式 结果为200

第一种写法

def f5(x:Int)(y:Int)(f:(Int,Int)=>Int):Int={
  f(x ,y)
}

f5(10)(20)(_*_) 

第二种写法

def f4(x: Int, y: Int, f: (Int, Int) => Int) = {
  f(x, y)
}

println(f4(10, 20, _ * _))

第三种写法

def f1(x:Int)={
  def f2(y:Int)={
    def f3(f:(Int,Int)=>Int):Int={
      f(x,y)
    }

    f3 _
  }

  f2 _
}

println(f1(600)(20)(_*_))

柯里化函数

举例

def f1(x: Int) = {
  def f2(y: Int): Int = {
    x + y
  }

  f2 _
}

println(f1(10)(20))

疑问

为什么f2可以使用x的值?

其实这个问题大家要回答很容易,但真正能回答到原理的估计没几个
首先我们从执行角度来看

f1(10)

x 在 f1 使用完后,就要被弹出栈了,f2是无论如何在取不到 x 的值

f1(10)(20)

所以这里Scala中就有一个闭包的概念

闭包

当一个函数使用了函数之外的变量时,为了防止变量数据失效,改变了变量的生命周期
将这个变量包含到了当前的函数中,形成了一种闭合效果,简称为闭包

柯里化函数

柯里化函数一般都具有闭包效果

def f5(x:Int)(y:Int)(f:(Int,Int)=>Int):Int={
  f(x ,y)
}

f5(10)(20)(_*_) 

下面这个就不是柯里化函数(不具有闭包效果)

def f4(x: Int, y: Int, f: (Int, Int) => Int) = {
  f(x, y)
}

println(f4(10, 20, _ * _))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值