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