方案列表操作

时间:2012-11-13 03:29:32

标签: recursion scheme

我无法弄清楚这个方案代码请帮忙。计算频率包含两个单独的列表查找列表和池列表。它应该返回一个列表,显示查找列表中的所有内容在池列表中的次数。 我知道我很接近它只是一些小错误,最有可能与递归调用后通过pool-list进行。

(define (compute-frequencies looking-for-list pool-list) 
  (define (helper looking-for-list pool-list current-frequency frequency-list)  ; keeps track of finished list and iterates through both lists
    (if (null? looking-for-list) (reverse frequency-list)                       ; finding the number of times data in looking-for-list are in pool-list
    (if (null? pool-list)
        (helper (cdr looking-for-list) pool-list 0 (cons current-frequency frequency-list))
        (if (equal? (car looking-for-list) (car pool-list))
        (helper looking-for-list (cdr pool-list) (+ 1 current-frequency) frequency-list)
        (helper looking-for-list (cdr pool-list) current-frequency frequency-list)))))

 (helper looking-for-list pool-list 0 '() ))

1 个答案:

答案 0 :(得分:2)

好的阅读你的代码似乎你的算法本身就很好。问题要简单得多。

一旦您检查了pool-list中要恢复looking-for-list的{​​{1}}中的第一个元素的pool-list的所有元素,请查看您的代码。为此,请使用helper作为pool-list来呼叫pool-list。你几乎肯定是指compute-frequency个参数中定义的那个,但是Scheme取helper个参数中的一个,因为它是compute-frequency中的阴影。这意味着在第一次迭代后,pool-list仅为'(),因此其他所有内容的频率均为0.

要解决此问题,请进行一些重命名。在将来,尝试记住Scheme变量可以并且将在更大范围内影响变量。而且,尝试使用cond而不是嵌套的if语句。在Scheme中更具可读性(这是我发现这个问题的方式)