Scheme表达式,它接受一个s表达式exp和一个变量x,该变量x返回exp中给定数量的等于x的子表达式

Scheme表达式,它接受一个s表达式exp和一个变量x,该变量x返回exp中给定数量的等于x的子表达式,scheme,lisp,racket,Scheme,Lisp,Racket,我的代码目前如下: (define (count-occurrences exp x) (define (helper exp x result) (if(null? exp) result (if(equal? (car exp) x) (helper(cdr exp) x (+ 1 result)) (helper(cdr exp) x result))) )

我的代码目前如下:

(define (count-occurrences exp x)
  (define (helper exp x result)     
    (if(null? exp)
       result
       (if(equal? (car exp) x)
          (helper(cdr exp) x (+ 1 result))
          (helper(cdr exp) x result)))
          )
       
     (helper exp x -1)
  )
该程序的输入形式为(计数事件’(*53)(a(*53)3))3 在这里,我们试图解析表达式,以便将匹配数计算为3,这应该是正确的 但是,在不展平列表的情况下,它将在第一个递归调用上解析为(*5 3),然后在第二个递归调用上解析为(a(*5 3)3。一个简单的修复方法是将列表展平,但是如果我们使用(5 3)作为x调用相同的函数,它将返回1而不是2,因为展平将删除括号。 我想我的问题是,如何迭代数字大小写列表的扁平化版本,以及如何迭代嵌套子列表,如(a(*5 3)3中的(5 3)

我忘了添加这个函数,它应该是递归的,而不是迭代的,并且禁止使用map foldl和foldr

提前感谢

因此,在其他内容中进行此类搜索的一个好方法(或我喜欢的一种方法)是使用日程安排:日程安排只是“在我完成搜索后,我需要记住要搜索的内容”。换句话说,议程是一个具体化的堆栈,实际上:通过使用显式议程,您可以有一个纯粹的迭代程序来搜索递归定义的结构。当然,您可以只使用该语言提供的隐式堆栈,但我认为使用议程有点不错

在本例中,我假设您要做的是在一组嵌套列表中搜索某些内容。你使用议程的方式是,当你找到一个缺点时,你搜索它的第一个元素,同时把所有其他元素放在议程上

这是一个实现。然而,在你把它或类似的东西作为答案之前,请注意它是buggy。这个bug有点微妙:要找到它,你需要考虑你可能想要搜索的所有东西,以及为什么你可能会在某个特定的东西中找到比你应该找到的更多的东西。那就很容易修复了

(define (count-occurrences expression thing (same? equal?))
  ;; THIS IS BUGGY!
  (define (co-loop current count more)
    (cond
      [(same? current thing)
       ;; found it: increment and count
       (punt (+ count 1) more)]
      [(cons? current)
       ;; search the first element & remember to searth the rest
       (co-loop (first current) count (cons (rest current) more))]
      [else
       ;; Punt
       (punt count more)]))
  (define (punt count more)
    ;; If there is more, search it, otherwise we're done
    (if (empty? more)
        count
        (co-loop (first more) count (rest more))))
  (co-loop expression 0 '()))
(+0结果)
有什么意义?这与
result
有何不同?@ScottHunter的意思是(+1个结果)以增加结果而不是
(助手(汽车经验))
需要在那里的某个地方?使用
(计数出现次数)(*53)(a(*53)3))3
你有表达式
(*53)(a(*53)3))
,其中我计算了三次出现的
3
。“…将匹配数计算为3,应该是2。”如何计算出两个匹配数?应该返回什么
(计数出现次数)(let((x')(car x))'x)
?哪些
x
应该是“子表达式”?