嚴格求值和惰性求值(2)

無限流與共遞歸
因為具有增量性質是己,我們所寫的函數(shù)也適用于無限流白筹,這里是一個由1組成的無限流的例子:

val ones: Stream[Int] = Stream.cons(1, ones)

盡管ones是無限的,我們目前為止寫的函數(shù)只檢測了Stream必要的部分兑牡,生產需要的輸出央碟。
練習 5.8
對ones稍微泛化一下,定義一個constant函數(shù)均函,根據(jù)給定值返回一個無限流亿虽。

  def constant[A](a: A): Stream[A] = cons(a, constant(a))

練習 5.9
寫一個函數(shù)生成一個整數(shù)的無限流,從n開始苞也,然后n+1洛勉、n+2,等等如迟。

def from(n: Int): Stream[Int] = cons(n, from(n + 1))

練習 5.10
寫一個fibs斐波那契數(shù)列的無限流:0收毫,1,1殷勘,2此再,3,5玲销,8输拇,等等。

  def fibs: Stream[Int] = {
    def loop(prev: => Int, curr: => Int): Stream[Int] =
      cons(prev, loop(curr, prev + curr))
    loop(0, 1)
  }

練習 5.11
寫一個更加通用的構造流函數(shù)unfold贤斜。它接受一個初始狀態(tài)策吠,以及一個在生成的Stream中用于產生下一狀態(tài)和下一個值的函數(shù)。

  def unfold[A, S](z: S)(f: S => Option[(A, S)]): Stream[A] = f(z) match {
    case None => Empty
    case Some((a, s))  => cons(a, unfold(s)(f)) 
  }

練習 5.12
根據(jù)unfold函數(shù)來實現(xiàn)fibs瘩绒、from猴抹、constant和ones。

  val ones1: Stream[Int] = unfold(1)(Some(1, _))

  def constant1[A](a: A): Stream[A] = unfold(a)(Some(a, _))

  def from1(n: Int): Stream[Int] =
    unfold(n)(s => Some(s, s + 1))

  def fibs1: Stream[Int] =
    unfold((0, 1)){
      case (prev, curr) => Some((prev, (curr, prev + curr)))
    }

練習 5.13
使用unfold實現(xiàn)map锁荔、take蟀给、takeWhile、zipWith以及zipAll

  def map1[B](f: A => B): Stream[B] =
    unfold(this){
      case Empty => None
      case Cons(h, t) => Some(f(h()), t())
    }

  def take1(n: Int): Stream[A] =
    unfold((n, this)){
      case (m, _) if m <= 0 => None
      case (_, Empty) => None
      case (a, Cons(h, t)) => Some(h(), (a - 1, t()))
    }

  def unCons[B >: A](s: Stream[B]): Option[(B, Stream[B])] = s match {
    case Empty => None
    case Cons(h, t) => Some(h(), t())
  }

  def takeWhile2(f: A => Boolean): Stream[A] =
    unfold(unCons(this)){
      case Some((h, t)) if f(h) => Some(h, unCons(t))
      case _ => None
    }
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市坤溃,隨后出現(xiàn)的幾起案子拍霜,更是在濱河造成了極大的恐慌,老刑警劉巖薪介,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件祠饺,死亡現(xiàn)場離奇詭異,居然都是意外死亡汁政,警方通過查閱死者的電腦和手機道偷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來记劈,“玉大人勺鸦,你說我怎么就攤上這事∧磕荆” “怎么了换途?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長刽射。 經常有香客問我军拟,道長,這世上最難降的妖魔是什么誓禁? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任懈息,我火速辦了婚禮,結果婚禮上摹恰,老公的妹妹穿的比我還像新娘辫继。我一直安慰自己,他們只是感情好俗慈,可當我...
    茶點故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布姑宽。 她就那樣靜靜地躺著,像睡著了一般闺阱。 火紅的嫁衣襯著肌膚如雪炮车。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天馏颂,我揣著相機與錄音示血,去河邊找鬼棋傍。 笑死救拉,一個胖子當著我的面吹牛,可吹牛的內容都是我干的瘫拣。 我是一名探鬼主播亿絮,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了派昧?” 一聲冷哼從身側響起黔姜,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蒂萎,沒想到半個月后秆吵,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡五慈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年纳寂,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泻拦。...
    茶點故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡毙芜,死狀恐怖,靈堂內的尸體忽然破棺而出争拐,到底是詐尸還是另有隱情腋粥,我是刑警寧澤,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布架曹,位于F島的核電站隘冲,受9級特大地震影響,放射性物質發(fā)生泄漏音瓷。R本人自食惡果不足惜对嚼,卻給世界環(huán)境...
    茶點故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望绳慎。 院中可真熱鬧纵竖,春花似錦、人聲如沸杏愤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽珊楼。三九已至通殃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間厕宗,已是汗流浹背画舌。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留已慢,地道東北人曲聂。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像佑惠,于是被迫代替她去往敵國和親朋腋。 傳聞我的和親對象是個殘疾皇子齐疙,可洞房花燭夜當晚...
    茶點故事閱讀 45,781評論 2 361

推薦閱讀更多精彩內容