使用累积递归在drracket中找到最长的胜利

时间:2014-06-03 19:55:30

标签: racket

假设(list 'win 'loss 'win 'win 'win 'loss 'win 'win)并使用累积递归产生最长的胜利,即3。我做的是如下:

(define (fun list)
  (local
    [(define (helper los accu1 accu2)
       (cond
         [(empty? los) (length accu2)]
         [else
          (cond
            [(equal? (first los) 'loss)
             (helper (rest los) 0 accu2)]
            [else
             (helper (rest los) 0 (cons (first los) accu2))])]))]
    (helper list empty empty)))

问题是当我在列表中丢失时我不知道该怎么做,我的功能只计算所有的胜利而不是最长的win.someone帮助请:)。

1 个答案:

答案 0 :(得分:1)

这可能是你想要的:

(define (fun lst)
  (define (helper lst current longest)
    (cond
      [(empty? lst)              (max current longest)]
      [(equal? (first lst) 'win) (helper (rest lst) (add1 current) longest)]
      [else                      (helper (rest lst) 0 (max current longest))]))
  (helper lst 0 0))

然后

> (fun (list 'win 'loss 'win 'win 'win 'loss 'win 'win))
3

重点是您需要 2 变量;一个用于当前连续'win符号的数量,一个用于以前最高连续数字。没有必要创建中间列表,计数器就足够了。