Recursion 方案-2个列表的较大列表及其总和

Recursion 方案-2个列表的较大列表及其总和,recursion,scheme,racket,Recursion,Scheme,Racket,给定两个长度相同的列表,在不使用任何内置函数lambda或set!。例如,给定以下两个列表: 名单A:(53-4610) 名单B:(4 9 6 4) 每对数字中较大的数字为: 更大的列表:5、4、9、6、10 所以总数是34。 我的代码是: (define (sum list1 list2) (cond ((null? list1) 0) ((null? list2) 0) ((>= (car list1) (car list2)) (

给定两个长度相同的列表,在不使用任何内置函数lambda或set!。例如,给定以下两个列表:

名单A:(53-4610)

名单B:(4 9 6 4)

每对数字中较大的数字为:

更大的列表:5、4、9、6、10

所以总数是34。 我的代码是:

(define (sum list1 list2)
  (cond ((null? list1) 0)
        ((null? list2) 0)
        ((>= (car list1) (car list2))
         (+ (car list1) (sum (cdr list1) (cdr list2)))
         (+ (car list2) (sum (cdr list1) (cdr list2)))
        )
   )
)
对于不同的输入,我会遇到不同的错误:

(总和)(5)(3) 3----与所需相反 (和(5)’(13))——无输出 (总和(5 1)(3 12) . . +: 违反合同 预期:数字? 给定:#----错误

正确的输出是

(sum '(1 9 0) '(-5 6 10))
> 20

我不确定什么不算作内置函数

(define (sum L1 L2)
      (if (null? L1)
          0
          (+ (if (> (car L1) (car L2)) 
                 (car L1)
                 (car L2))
             (sum (cdr L1) (cdr L2))))) 

大概是我能得到的最小值。

你在你的
条件中忘记了
其他
-

(定义(总和列表1列表2)
(条件((空?列表1)0)
((空?列表2)0)
((>=(车辆列表1)(车辆列表2))
(+(车辆列表1)(总和(cdr列表1)(cdr列表2)))
(其他(+(汽车清单2)(总和(cdr清单1)(cdr清单2()())))
这里有另一种写作方法-

(定义(最大a和b)
(如果(>ab)ab))
(定义(总和a和b)
(如果(或(无效a)(无效b))
0
(+(最大(a车)(b车))
(总数(cdr a)(cdr b(()())))

当您没有
else
条款时,方案实施可以自由选择任何合适的条款。似乎您的实现返回的不是数字

以下是插入不确定性的代码:

(define (sum list1 list2)
  (cond ((null? list1) 0)
        ((null? list2) 0)
        ((>= (car list1) (car list2))
         ;; the code line below is dead code. It is the last
         ;; expression that is the tail call and result 
         (+ (car list1) (sum (cdr list1) (cdr list2))) ; dead
         (+ (car list2) (sum (cdr list1) (cdr list2))))
        ;; this is what hapens when the first element of
        ;; list1 is smaller than the first element of list2
        (else 'i-choose-you-pikachu)))
因此,当你传递它时,你得到的不是
#
(sum'(1)-(2))
,而是
i-choose-you-pikachu
,而这不是一个数字。因此,如果你传递它,它将发出R6RS和更新版本的错误信号,而在R5RS中,清管器可能会飞,因为标准并没有直接涵盖这类情况

还要注意的是,在第三项中,它不是取最大的,而是取最小的<代码>(和(2)’(1));=>4

因此,您需要处理每个术语的结果,然后为最后一个可能性添加一个
else
术语:

(define (sum list1 list2)
  (cond ((null? list1) 0)
        ((null? list2) 0)
        ((>= (car list1) (car list2))
         (+ (car list1) (sum (cdr list1) (cdr list2))))
        (else 
         (+ (car list2) (sum (cdr list1) (cdr list2))))))

还要注意,缩进告诉您问题中的术语和右括号是孤立的。如果您需要像这样匹配它们,那么您使用的编辑器是错误的

您正试图将
#f
添加到一个数字中。这是怎么回事?用
0
替换
#f
,你的
条件的最后一句也有问题。更明确地说:你没有理由
(<(汽车列表1)(汽车列表2))
。最后一个子句有两个值表达式,丢弃
(+(car list1)…
的值,结果是
(+(car list2)…