youtube "helper" 视频
视频里的是按大小排一堆image
我们这里用类似的题,但简单一点,把helper 的用法介绍一下
假设我们有一个listof String, 我们想把按string 长短顺序排列并全部append 到一起以空格为间隔
这个function 名字叫arrange-strings
(arrange-strings (cons "cc" (cons "c" (cons "aaaa" empty))))
-> "c cc aaaa"
类似视频中的步骤, 这一题可以写成这样(省略signature, purpose...)
通过例子,我们看一下helper知识点在这里的应用
(define (arrange-strings los)
(append-strings (sort-strings los)))
(define (append-strings los)
(cond [(empty? los) ""]
[else
(string-append (first los)
" "
(append-strings (rest los)))]))
(define (sort-strings los)
(cond [(empty? los) empty]
[else
(insert (first los)
(sort-strings (rest los)))]))
(define (insert s los)
(cond [(empty? los) (cons s empty)]
[else
(if (smaller? s (first los))
(cons s los)
(cons (first los)
(insert s (rest los))))]))
(define (smaller? s1 s2)
(< (string-length s1)
(string-length s2)))
-
Function Composition
;;arrange-strings 用到的是Function Composition
;;相当于把一个task 细分成两部,第一步是sort-strings, 然后是append-strings
;;每一个subtask就是一个helper
(define (arrange-strings los)
(append-strings (sort-strings los)))
-
operation on data of arbitrary size rule
;;insert 用到的是operation on data of arbitrary size rule
;;这里是用到insertion sort 的算法,就是把一个string 加差到一个已经排好序的listof String中
;;例如把 “cc” 插到 ("c" "ccc" "cccc" "ccccc")里面去
;;但是这里不一定要遍历整个list才找到位置, 当“cc” 发现比"ccc"短的时候
;; "cc"就放到“ccc”前面就可以了, 因为"ccc" 后面已经排好了
;;像这样,不一定要走完整个list的操作,我们需要用到helper
(define (insert s los)
(cond [(empty? los) (cons s empty)]
[else
(if (smaller? s (first los))
(cons s los)
(cons (first los)
(insert s (rest los))))]))
-
domain knowledge shift
;;smaller? 用到的是domain knowledge shift
;;在(insert s los)里面我们的主要问题是把一个string 插入到排好序的listof String中
;;但我们需要判断两个String的长度,相当于带出了另外一个问题,这时候,就相当于
;;产生了支线任务,需要用到helper
(define (smaller? s1 s2)
(< (string-length s1)
(string-length s2)))