Recursion 方案-2个列表的较大列表及其总和
给定两个长度相同的列表,在不使用任何内置函数lambda或set!。例如,给定以下两个列表: 名单A:(53-4610) 名单B:(4 9 6 4) 每对数字中较大的数字为: 更大的列表:5、4、9、6、10 所以总数是34。 我的代码是: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)) (
(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)…