List 方案中的候选函数和循环函数

List 方案中的候选函数和循环函数,list,scheme,element,frequency,List,Scheme,Element,Frequency,此函数用于查找列表中元素的引用,然后打印引用列表和元素。第二个打印非减量整数列表的模式。也就是说,当您编写(makeelementfreq list'(111234455))时,它会打印'((1.2)(2.2)(3.1)(4.2)(5.3))。但是我不能理解这里的候选'()和循环(为什么需要l?)操作。有人能帮我理解这些吗?谢谢 #lang racket (define make-element-freq-list (lambda (l) (let loop ((l l) (cand

此函数用于查找列表中元素的引用,然后打印引用列表和元素。第二个打印非减量整数列表的模式。也就是说,当您编写(makeelementfreq list'(111234455))时,它会打印'((1.2)(2.2)(3.1)(4.2)(5.3))。但是我不能理解这里的候选'()和循环(为什么需要l?)操作。有人能帮我理解这些吗?谢谢

#lang racket
(define make-element-freq-list
  (lambda (l)
    (let loop ((l l) (candidate '()) (count 0))
      (cond
        ((null? (cdr l)) (append candidate (list (cons (car l) (+ count 1)))))
        (else
         (if (equal? (car l) (cadr l))
             (loop (cdr l) candidate (+ count 1))
             (loop (cdr l) (append candidate (list (cons (car l) (+ count 1)))) 0 )))))))  
(define mode
  (lambda (l)
    (let loop ((l l) (max-freq (cdar l)) (mode (caar l)))
      (cond
        ((null? l) mode)
        (else
         (if (> max-freq (cdar l))
             (loop (cdr l) max-freq mode)
             (loop (cdr l) (cdar l) (caar l) ))))))) 
对于这一点,语法上有很大的帮助:

(define (make-element-freq-list l)
  (define (loop l candidate count)
    ...)

  (loop l '() 0))
因此,在命名的
中,让
拥有第一个应用程序的初始值以及它应该绑定的名称。在中,让您以与使用
define
创建并调用它相同的方式调用它

循环的名称就是这样。一个名字。您可以随意调用它,但
loop
是尾部递归代码的命名约定

Scheme没有任何循环或迭代构造,这些构造不仅仅是以递归调用迭代结束的抽象(过程或宏)

(define (make-element-freq-list l)
  (define (loop l candidate count)
    ...)

  (loop l '() 0))