Scheme 校验和方案

Scheme 校验和方案,scheme,Scheme,好吧,我的朋友和我已经尝试了很多次,拒绝去找家教,因为他们所做的只是给我们答案,这对我们学习没有任何帮助 到目前为止,我可以让代码执行以下两种操作之一,返回列表的总和或列表本身,我们需要得到它,以便它将返回列表和总和的最后一位。到目前为止,我们有两件事: (define (add-checksum ls) (cond [(null? ls) 0] [else (+ (car ls) (add-checksum (cdr ls)))])) (define (add-check

好吧,我的朋友和我已经尝试了很多次,拒绝去找家教,因为他们所做的只是给我们答案,这对我们学习没有任何帮助

到目前为止,我可以让代码执行以下两种操作之一,返回列表的总和或列表本身,我们需要得到它,以便它将返回列表和总和的最后一位。到目前为止,我们有两件事:

(define (add-checksum ls)
  (cond
    [(null? ls) 0]
    [else (+ (car ls) (add-checksum (cdr ls)))]))

(define (add-checksum-helper ls)
  (cond
    [(null? ls) 0]
    [else (cons (car ls) (add-checksum-helper (cdr ls)))]))
第一组代码执行加法运算并返回总和。第二个返回列表加上一个
.0
,总和的最后一位应该放在哪里?有人能帮我们吗?谢谢

编辑:

(define (checksum ls)
  (append ls ((cdr (add-checksum ls)))))

(define (add-checksum ls)
  (cond
    [(null? ls) 0]
    [else (+ (car ls) (add-checksum (cdr ls)))]))
报税表为:

(checksum '(4 5 6 7 8))
((4 5 6 7 8) . 30)

我们需要它返回
(45 6 7 8 0)
,而不是
(.30)
。我们不知道如何获得
0
。如果我们做了
(cdr 30)
,我们得到的列表不是成对的。现在有什么建议吗?

听起来最简单的方法是使用两个单独的函数作为最终函数的助手;一个计算总和的人,一个把数字放在最后的人


这可能是因为你的作业要求你只遍历列表一次,然后在向下的过程中进行计算——这是一个有点虚假的要求,因为两种情况下的渐进复杂性都是相同的。

添加校验和的过程很好,但是,使用原始列表中的
apply
+
过程可以得到相同的结果

对于第二部分:是否需要将校验和存储在最后一个位置?将其存储在第一个位置会简单得多,方法是
cons
-将调用
的结果与原始列表相加

最后,如果您需要提取数字的最后一位,请使用
n
正整数尝试以下操作:

(remainder n 10)
例如:

(remainder 28 10)
> 8

给定列表
(1 2 3)
,您想返回什么?下面的一对:
(6.(12 3))
?我们需要它返回(添加校验和)(4 6 7 5 6))返回(4 6 7 5 6 8),其中8是28中的第二个数字,您需要一个函数来完成它?我们做了两个单独的函数只是为了尝试一下,但是试着把它们都放到一个函数中,我们会得到返回的布局应该是什么,唯一的问题是分离和。我们需要有总和的cdr,或者只是最后一位数字,而不是完整的总和。但是每当我们尝试做(CDR30)(根据例子)时,我们得到的30不是一对。我想我们现在的问题是,我们如何分割一个元素,比如如果28是我们的和,它是一个单独的元素。我们怎么舍弃2号而只得到8号呢?