2016-04-18 14 views
-2

この関数は、リスト内の要素の出現を見つけて、オカレンスと要素のリストを出力します。 2番目の引数は、非減少整数のリストのモードを出力します。あなたが書いたときに(make-element-freq-list '(1 1 2 2 3 4 4 5 5 5))それは印刷されます'((1.2)(2.2)(3.1)(4.2 )(5.3))。しかし、私はここで候補( ')とループ(なぜll?)操作を理解できません。誰も私がこれらを理解するのを助けることができますか?ありがとう。スキームの候補とループ関数

#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)))))))) 

答えて

1
(define (make-element-freq-list l) 
    (let loop ((l l) (candidate '()) (count 0)) 
    ...)) 

このためかなりの糖衣構文です:

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

    (loop l '() 0)) 

だから、名前の中にletあなたは一緒にそれがで結合されなければならない名前の最初のアプリケーションの初期値を持っています。あなたがそれをdefineで作られたと同じように呼び出させて呼び出します。

名前はloopです。名前。あなたは好きなものを呼び出すことができますが、末尾の再帰コードの命名規則はloopです。

Schemeには、再帰呼び出しを繰り返して終了する抽象化(プロシージャまたはマクロのいずれか)ではなく、ループまたは反復構造がありません。

関連する問題