Haskell笔记4

 divide and conquer

这一部分主要是对作业中divideAndConquer的解释,因为我觉得这个...一开始就没怎么理解。

divideAndConquer ::

  (a -> Bool) ->

  (a -> b) ->

  (a -> (a,a)) ->

  (b -> b -> b) ->

  a -> b

divideAndConquer simpleEnough simpleCases splitFunction combineFunction =

  recursively

  where

    recursively input =

      if simpleEnough input then simpleCases input

      else

        let

          (left,right) = splitFunction input

        in

          combineFunction (recursively left) (recursively right)

sort :: [Integer] -> [Integer]

sort =

  divideAndConquer

  (\list -> length list <=1)

  id

  (\list-> splitAt(length list`div`2) list)

  merge

merge::[Integer]->[Integer]->[Integer]

merge [] ys = ys

merge xs [] = xs

merge (x:xs) ys | x

这里我们尝试使用divideAndConquer方法来进行merge sort。

首先divideAndConquer的定义:

divideAndConquer ::

  (a -> Bool) ->

  (a -> b) ->

  (a -> (a,a)) ->

  (b -> b -> b) ->

  a -> b

它接受4个函数加一个任意类型的参数返回一个任意类型的参数。

在后面recursivly给出来具体的定义。

recursively

  where

    recursively input =

      if simpleEnough input then simpleCases input

      else

        let

          (left,right) = splitFunction input

        in

          combineFunction (recursively left) (recursively right)

我们结合后面的具体定义一起来看:

 divideAndConquer

  (\list -> length list <=1)

  id

  (\list-> splitAt(length list`div`2) list)

  merge

simpleEnough检查list是否被分解到长度为1或者0,如果是它返回simpleCase,在这里,由于元素少于两个,所以没有作排序的必要,我们直接返回它本身即 identity function -- id。

如果不是,那么我们首先将list分为两半然后merge这两半。对于每个要merge的对象,我们再应用recursivly。迭代将于长度为1终止。例如:

[2,1,4,3] = merge [2,1] [4,3] = merge (merge [2] [1]) (merge [4] [3])

对于[1],[2],[3],[4]来说,它们都simpleEnough也所以应用了simpleCases即返回它们本身。然后进行了merge。

[2,1,4,3,5] = merge [2,1] [4,3,5] = merge (merge [2] [1]) (merge [4] [3,5]) =  merge (merge [2] [1]) (merge [4] (merge [3] merge [5]))

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,358评论 0 33
  • pyspark.sql模块 模块上下文 Spark SQL和DataFrames的重要类: pyspark.sql...
    mpro阅读 13,226评论 0 13
  • 【卓佐日记 Day 5】20180528 记录就没有发生# 【昨日成就】 1. 完成讲书人读书与输出 2. 拖地 ...
    迎庆心烘焙阅读 1,625评论 1 4
  • 一个民族对阅读的亲近程度,决定着这个民族整体素质的高低。 我今天要谈的阅读,仅限定于纸面书籍的阅读。...
    元吉利贞阅读 2,454评论 2 1
  • 外行引导内行本身就是误区,内行的专业性,通透性,外行人做不到就无法胜任团队。
    孙倩倩Rela阅读 1,549评论 0 0

友情链接更多精彩内容