Recursion 拿一张单子,减去单子上的每一个数字,下一个数字在球拍里
给定球拍中任意长度的列表,根据连续元素差值的绝对值创建一个新列表。新列表的最后一个元素应该是输入列表的第一个元素和最后一个元素之间差值的绝对值 例如:输入t=(2,6,7,11)应导致t'=(4,1,4,9) 以下是我所拥有的:Recursion 拿一张单子,减去单子上的每一个数字,下一个数字在球拍里,recursion,scheme,racket,Recursion,Scheme,Racket,给定球拍中任意长度的列表,根据连续元素差值的绝对值创建一个新列表。新列表的最后一个元素应该是输入列表的第一个元素和最后一个元素之间差值的绝对值 例如:输入t=(2,6,7,11)应导致t'=(4,1,4,9) 以下是我所拥有的: (define (a-succ t i) (cond [(empty? t) empty] [(>= i (size t)) t] [else (cons (abs (- (first t)
(define (a-succ t i)
(cond [(empty? t) empty]
[(>= i (size t)) t]
[else
(cons (abs (- (first t)
(first (rest t))))
(a-succ (rest t) i))]))
问题是,通过这种方法,我不能用最后一个数字减去列表的第一个数字,因为第一个数字在运行程序后会发生变化。所以我认为需要做的第一步是,通过定义一个新函数,用倒数第一个数减去第一个数。我只是不知道如何更改列表一次,然后将我的递归函数应用于更改的列表。不清楚为什么在发布的代码中需要参数
I
。另外,请注意,基本情况(空?t)
永远不会到达,因为(>=i(大小t))
总是先到达
I通常解决在处理过程之前需要修改过程中的输入列表的问题的方法是使用:
在这里,helper
函数执行实际工作,而pairwise diff
只需使用修改后的输入列表调用helper
样本交互:
scratch.rkt>(成对差异(2 6 7 11))
'(4 1 4 9)
诀窍是定义一个助手。如果该助手是顶级函数,则它需要携带列表的第一个元素:
(define (a-succ l)
(asl l (first l) '()))
(define (asl t f r)
(if (empty? (rest t))
(reverse (cons (abs (- f (first t))) r))
(asl (rest t) f (cons (abs (- (first t) (second t))) r))))
但您可以将其设置为本地函数,这意味着它可以依赖于了解其父级获得的列表:
(define (a-succ l)
(define (asl t r)
(if (empty? (rest t))
(reverse (cons (abs (- (first l) (first t))) r))
(asl (rest t) (cons (abs (- (first t) (second t))) r))))
(asl l '()))
长度为1的列表应该生成什么?这是家庭作业吗?你的解决方案有什么限制吗?您的解决方案必须使用递归吗?“我已经尝试了很多事情……我只是找不到一个好的方法……”:尽你最大的努力;什么不起作用?legth 1的列表应给出(列表0)。这是一个家庭作业练习,旨在通过递归解决。下面是我到目前为止得到的代码。在发布的代码中,
i
的用途是什么?在问题描述中没有提到这一点。如果您显示一个示例函数调用和预期结果(而不是在逗号分隔的列表上显示抽象转换),这将非常有用。另外,什么是尺寸
?你的意思是长度,还是你在用朗朗球拍,或者其他学生的语言?
(define (a-succ l)
(asl l (first l) '()))
(define (asl t f r)
(if (empty? (rest t))
(reverse (cons (abs (- f (first t))) r))
(asl (rest t) f (cons (abs (- (first t) (second t))) r))))
(define (a-succ l)
(define (asl t r)
(if (empty? (rest t))
(reverse (cons (abs (- (first l) (first t))) r))
(asl (rest t) (cons (abs (- (first t) (second t))) r))))
(asl l '()))