Recursion 方案-递归案例

Recursion 方案-递归案例,recursion,scheme,racket,Recursion,Scheme,Racket,我正在完成一个Scheme赋值,我在处理两个函数的递归情况时遇到了一些问题 第一个函数是一个运行求和函数,它接受一个列表并返回一个运行求和列表,即summer'1 2 3-->1 3 6现在我相信我已经非常接近了,但我不太清楚如何解决我的问题。目前我有 (define (summer L) (cond ((null? L) '()) ((null? (cdr L)) '()) (else (cons (car L) (+ (car L) (ca

我正在完成一个Scheme赋值,我在处理两个函数的递归情况时遇到了一些问题

第一个函数是一个运行求和函数,它接受一个列表并返回一个运行求和列表,即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.所以很接近;我只是不知道如何处理检查,如果我已经计算了元素


非常感谢您的帮助,谢谢

要有一个连续的总和,您需要以某种方式跟踪最后一个总和。因此,一些过程应该有两个参数:列表的其余部分要求和,可能是整个列表和到目前为止的总和

(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)))))))
在继续之前,请确保删除已计数的元素!我想你可以把剩下的补上。

关于你的第一个问题:

过程中的错误是,没有对summer的递归调用。请看最后一行

(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))

你能分享你期望第二个过程的输出是什么吗?当然!计数'abccbb->'a1b3c2,但其当前返回'a。1 b。3 c。2 c。1 b。2 b。1.所以就要结束了,我只是不知道如何处理检查,如果我已经计算了一个元素,你不应该同时问两个不同的问题。每个问题都应该分开问。我对伯爵的程序有点困惑。你是说我可以删除元素,然后从列表中删除元素,然后再递归地将列表传递回?是的,一旦你计算了列表中出现的bs,我们希望在继续之前删除它们,这样它们就不会再次被计算。