Scheme 计划;“合并”;功能实现
我正在尝试使用Scheme创建一个Merge2函数,该函数接受两个有序列表,并将它们合并到一个有序列表中。例如Scheme 计划;“合并”;功能实现,scheme,Scheme,我正在尝试使用Scheme创建一个Merge2函数,该函数接受两个有序列表,并将它们合并到一个有序列表中。例如(合并2'(1 3 4)'(2 4 5))将产生(1 2 3 4 5) 这是我的尝试。。我觉得这样应该行得通,我只需检查每个列表的car的min,然后将这个min附加到merge2的递归调用中。然后我的基本情况是,当其中一个列表变为空时,它应该只返回要追加的另一个列表 (define (merge2 a b) (if (and (null? a) (null? b))
(合并2'(1 3 4)'(2 4 5))
将产生(1 2 3 4 5)
这是我的尝试。。我觉得这样应该行得通,我只需检查每个列表的car
的min
,然后将这个min
附加到merge2
的递归调用中。然后我的基本情况是,当其中一个列表变为空时,它应该只返回要追加的另一个列表
(define (merge2 a b)
(if (and (null? a) (null? b))
`())
(if (null? a) b)
(if (null? b) a)
(display a)
(display b)
(if (= (min (car a) (car b)) (car a))
(append (list (min (car a) (car b))) (merge2 (cdr a) b)))
(if (= (min (car a) (car b)) (car b))
(append (list (min (car a) (car b))) (merge2 a (cdr b)))))
这将产生:
(1)(2)(2)(3)(4)(2)(3)(4)(2)(3)(4)(3)(4)(4)()4
TypeError:无法调用未定义的[merge2,merge2,merge2,merge2,merge2,car,merge2,merge2,merge2,merge2,car,merge2,merge2,merge2,merge2,merge2,car]的方法“apply”
解决方案更简单,使用两个列表都已排序的事实,从一个列表中选择一个元素,并根据哪个元素更大进行排序,直到其中一个列表结束。这就是我的意思:
(define (merge lst1 lst2)
(cond ((null? lst1) lst2)
((null? lst2) lst1)
((>= (car lst1) (car lst2))
(cons (car lst2) (merge lst1 (cdr lst2))))
(else
(cons (car lst1) (merge (cdr lst1) lst2)))))
它按预期工作:
(merge '(1 3 4) '(2 4 5))
=> '(1 2 3 4 4 5)
作为一种函数式编程语言,Scheme是面向表达式的,而不是命令式的,这可能是您正在努力解决的问题之一。因此,Scheme中写入的所有内容都有一个值,即使是条件表达式。每件事都是一个表达式,计算它是为了产生一个结果。当您坚持纯函数式编程风格(Scheme鼓励但不严格执行)时,将对表达式求值,以生成可以成为另一个待求值表达式的一部分的结果。表达式只是简单的计算,它们不是导致计算机内存状态以某种方式改变的过程;函数式编程风格没有副作用。因此,您应该从条件表达式的角度来考虑条件处理 从命令式编程世界中,我能想到的最接近的对应物是C或Java的
?:
操作符。您的函数从一系列条件表达式开始,但这些表达式类似于C或Java中的一系列条件表达式,它们没有分配给任何对象,因此结果被“丢弃”
相反,从这些术语开始思考:我们希望将两个列表合并在一起,那么如果其中一个列表为空,那么将两个列表合并在一起意味着什么呢?这为合并两个列表的迭代过程形成了一种“基本情况”或终止条件
另外:如果两个列表都不是空的,那么将它们合并在一起意味着什么?如果我们可以在现有列表(即归纳步骤)的基础上,用较小的列表来表示解决方案,那么我们就可以开始递归过程
因此,这一归纳步骤的部分解决方案将涉及某种表达式,其基于检查每个列表的car
,以确定哪一个应该放在剩余列表合并的开头。如果(车辆a)
小于或等于(车辆b)
,则(车辆a)
可以成为(合并2(cdr a)b)
的第一个元素,对吗?这假设有一种方法可以计算(合并(cdr a)b)
,当然
因此,听起来我们谈论的是一个条件表达式,它将成为更大定义或表达式的一部分,说明将两个列表合并在一起意味着什么:
(cond ((<= (car a) (car b)) (cons (car a) (merge2 (cdr a) b) ) )
...there's more to write here to finish the conditional expression )
(cond)((这似乎非常接近我的目的。我想我还没有完全掌握语法。谢谢你