我正在完成一个Scheme任务,我在使用两个函数的递归情况时遇到了一些麻烦。
第一个函数是一个 running-sums 函数,它接受一个列表并返回一个运行总和列表,即(summer '(1 2 3)) ---> (1 3 6)
现在我相信我非常接近但不能很清楚如何解决我的问题。目前我有
(define (summer L)
(cond ((null? L) '())
((null? (cdr L)) '())
(else (cons (car L) (+ (car L) (cadr L))))))
我知道我需要递归调用summer
,但我对如何将递归调用放在那里感到困惑。
其次,我正在编写一个函数来计算列表中元素的出现次数。通过使用辅助函数,此函数可以正常工作,但它会创建重复对。
(define (counts L)
(cond ((null? L) '())
(else (cons (cons (car L) (countEle L (car L))) (counts (cdr L))))))
(define (countEle L x)
(if (null? L) 0
(if (eq? x (car L)) (+ 1 (countEle (cdr L) x)) (countEle (cdr L) x))))
预期输出为:
(counts '(a b c c b b)) --> '((a 1) (b 3) ( c 2))
但它目前正在返回'((a . 1) (b . 3) (c . 2) (c . 1) (b . 2) (b . 1))
。所以它很接近;我只是不确定如何处理检查我是否已经计算了元素。
感谢任何帮助,谢谢!
答案 0 :(得分:1)
要获得一笔运行金额,您需要以某种方式跟踪最后一笔金额。所以一些程序应该有两个参数:要汇总的列表的其余部分(可能是整个列表)和到目前为止的总和。
(define (running-sum L)
(define (rs l s)
...)
(rs L 0))
对于第二个程序,您想要执行类似
的操作(define (count-elems L)
(define (remove-elem e L) ...)
(define (count-single e L) ...)
(if (null? L)
'()
(let ((this-element (car L)))
(cons (list this-element (count-single this-element L))
(count-elems (remove-elem this-element (cdr L)))))))
在继续之前,请务必删除您计算过的元素!我想你可以填补其余部分。
答案 1 :(得分:0)
第一个问题:
你的程序中的错误是,没有"夏天"的递归调用。看看最后一行。
(else (cons (car L) (+ (car L) (cadr L))))))
以下是完整的解决方案:
(define (summer LL)
(define (loop sum LL)
(if (null? LL)
'()
(cons (+ sum (car LL)) (loop (+ sum (car ll)) (cdr LL)))))
(loop 0 LL))