1. 程式人生 > >scala小練習三

scala小練習三

關鍵程式碼+執行截圖

1.編寫函式values(fun(Int)=>Int, low:Int,high: Int)該函式輸出一個集合,對應給定區間
內給定函式的輸入和輸出。比如values(x=>x*x,-5,5) 應該產生集合(-5,25) (-4,16) ….

def values(fun:(Int)=>Int,low:Int,high:Int):List[(Int,Int)]={
    var col=List[(Int,Int)]()
    for(a <-low to high){
      col=(a,fun(a))::col
    }
    return
col }

這裡寫圖片描述

2.讀下圖的程式,將其改為高階函式的形式 。

def formatAbs(func:(Int)=>Int,a:Int)={
    val msg="The absolute value of %d is %d"
    func(a)
  }
  def main(args: Array[String]): Unit = {
    println(formatAbs((n:Int)=>if(n<0) -n else n,-42))
  }

這裡寫圖片描述

3.用correspond方法讓我們判斷某個字串數組裡面所有元素的長度是否和某個給定的整數數
組一致。

def main(args: Array[String]): Unit = {
    val a=Array("aa","bb","cc")
    val b=Array(2,2,2)
    val c=Array(1,2,3)
    println(a.corresponds(b)(_.length==_))
    println(a.corresponds(c)(_.length==_))
  }

這裡寫圖片描述

4.def getGreetingFunc(msg: String) = (name: String) => println(msg + “,” + name)
在這個表示式中,根據閉包的定義,找出非區域性變數。
msg
5.假設某國的貨幣有若干面值,現給一張大面值的貨幣要兌換成零錢,問有多少種兌換方式。

def changmmoney(money:Int,change:List[Int]): Int ={
    if(0==money) return 1//完成一種換法
    if(money<0||change.size==0) return 0//該種換法沒有成功
    changmmoney(money,change.tail)+changmmoney(money-change.head,change)
    //前者為按面值種類遞迴,每次刪掉一種面值,求只用其餘面值能得到的換法數量
    //後者為開始兌換,每次都用一種面值進行兌換,能將money減為0的返回1
    //單獨看後者遞迴,都是用同一種面值進行減法,但與前者相結合,所有遞迴下來就變成了每種面值都嘗試過
  }
  def main(args: Array[String]): Unit = {
    println(changmmoney(10,List(5,10)))
    println(changmmoney(10,List(1,2,5,10)))
  }

這裡寫圖片描述

6.寫一個遞迴函式,來獲取第n個斐波那契數,前兩個斐波那契數0 和 1,第n個數總是等於前
兩個數的和——序列開始為0,1,1,2,3,5

def fib(n:Int,a:Int,b:Int): Int ={
    if(n==1) return a
    fib(n-1,b,a+b)
  }
  def main(args: Array[String]): Unit = {
    println(fib(6,0,1))
  }

這裡寫圖片描述

7.def partial[A,B,C](a: A, f:(A,B) => C): B => C = (b: B) =>?
函式partial 有三個型別引數A,B,C 它帶有兩個引數,引數f本身是一個有兩個引數返回值為C的
函式,函式partial返回值型別也是函式,型別為B=>C

def partial[A,B,C](a:A, f:(A,B) => C):B=>C=(b:B)=>{
    b[C]//匿名函式,引數是B型別,返回C型別
  }