首页 文章

传递一个函数来计算方案列表中的出现次数

提问于
浏览
-1

我正在尝试创建一个辅助函数,它传递的函数甚至是偶数?还是奇怪的?并计算列表中出现的次数 . 我似乎开发了完美的逻辑,但我得到一个错误(在底部),但无法弄清楚为什么 . 我传递'(cdr L)作为一个字符串,并把它的汽车用作一个整数,为什么它会说给'cdr? L应该是一个列表,'(cdr L)应该是一个列表..为什么这不起作用?

(define (fhelper F L )
    (if (> (length L) 1)
    (if (F (car L)) (+ 1 (fhelper F '(cdr L)))
                    (+ 0 (fhelper F '(cdr L))) )

    (if(F (car L))  1
                    0
                    )
                    )
    )

(fhelper even? '(1 2 3 4 ))
. . even?: contract violation
  expected: integer
  given: 'cdr

我试过测试看到(甚至?(car'(1 2))返回#f所以我知道它不是我的(F(车辆L))部分的问题,所以看起来好像递归调用正在应用F '(cdr L)而不是使用那些作为参数,我没有得到,因为我三重检查文档,似乎应该工作?

2 回答

  • 2

    正如我在评论中写的那样,您不能引用 (cdr L) ,因为您希望执行调用 .

    您似乎对您的代码非常满意,但它并不是非常惯用的;应该看起来像

    (define (fhelper func lst)
      (if (null? lst)
          0
          (+ (if (func (car lst)) 1 0)
             (fhelper func (cdr lst)))))
    

    或者,作为尾递归程序:

    (define (fhelper func lst)
      (let loop ((lst lst) (count 0))
        (if (null? lst)
            count
            (loop (cdr lst)
                  (if (func (car lst)) (add1 count) count)))))
    
  • 2

    如果您熟悉它,请使用 foldl 的另一个解决方案:

    (define (fhelper f l)
      (foldl (λ (x xs) (if (f x) (add1 xs) xs))
             0
             l))
    

相关问题