P17 (*) Split a list into two parts; the length of the first part is given.
2016-01-16 10:04
447 查看
问题描述
Do not use any predefined predicates(functions).sash> (split '(a b c d e f g h i k) 3) sash> ((a b c) (d e f g h i k))
题目要求“自己动手,丰衣足食“。
解法
尾递归实现
(define split (lambda (ls n) (let f ([i 1] [ls1 '()] [ls2 ls]) (cond [(> i n) (list (reverse ls1) ls2)] [else (f (+ i 1) (cons (car ls2) ls1) (cdr ls2))]))))
上面用到了
reverse,貌似不满足题目要求。
普通递归实现
将上面ls1的累积过程改成普通递归形式。在一次遍历实现,需要借助复杂的控制才能实现。如果两次遍历,第一次遍历得到前n个元素的列表,第二次得到其余元素的列表,两次结果cons得到最终结果。
目前没想到满意的方案,暂为空
CPS实现
ls1累积前n个元素,
ls2累积其余的元素。
(define split-2 (lambda (ls n k) (let f ([i 1] [s ls] [k k]) (cond [(null? s) (k '() '())] [(<= i n) (f (+ i 1) (cdr s) (lambda (ls1 ls2) (k (cons (car s) ls1) ls2)))] [else (f (+ i 1) (cdr s) (lambda (ls1 ls2) (k ls1 (cons (car s) ls2))))])))) (define return (lambda (ls1 ls2) (list ls1 ls2))) (define split (lambda (ls n) (split-2 ls n return)))
CPS方式特别适合在函数中收集多个中间结果的情况,这里收集了
ls1和
ls2。
相关文章推荐
- 网络营销之CPA、CPS、CPM、CPT、CPC 是什么
- CPA CPS CPC CPM CPO PPC PPL PPS CPTM 各个含义解说
- Ruby中使用Block、Proc、lambda实现闭包
- Ruby中的block、proc、lambda区别总结
- C#中的递归APS和CPS模式详解
- C++实现的一个可以写递归lambda的Y函数
- C#特性之匿名方法和Lambda表达式
- 理解C#中的Lambda表达式
- 初步认识C#中的Lambda表达式和匿名方法
- C#3.0中Lambda表达式详解
- C#基础之Lambda表达式用法实例教程
- 深入理解Java中的Lambda表达式
- Java8新特性之Lambda表达式浅析
- Java Lambda表达式详解和实例
- Java函数式编程(一):你好,Lambda表达式
- 用Python编写一个简单的Lisp解释器的教程
- python中lambda与def用法对比实例分析
- Python lambda和Python def区别分析
- Python中的特殊语法:filter、map、reduce、lambda介绍
- 跟老齐学Python之大话题小函数(1)