Scheme 计划;“合并”;功能实现

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))

我正在尝试使用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))
        `())
    (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)((这似乎非常接近我的目的。我想我还没有完全掌握语法。谢谢你