Scheme - 递归案例

时间:2018-02-11 20:45:41

标签: recursion scheme racket

我正在完成一个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))。所以它很接近;我只是不确定如何处理检查我是否已经计算了元素。

感谢任何帮助,谢谢!

2 个答案:

答案 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))