2016-04-18 14 views
-2

Diese Funktion sucht das Vorkommen der Elemente in der Liste und gibt dann eine Liste des Vorkommens und des Elements aus. Der zweite gibt den Modus der Liste nicht kleiner werdender Ganzzahlen aus. Dann schreibt man (make-element-freq-list '(1 1 2 2 3 4 4 5 5 5)) es druckt' ((1. 2) (2. 2) (3. 1) (4. 2) (5. 3)). Aber ich kann den Kandidaten '() und die Schleife (warum dauert es hier?) Operation hier nicht verstehen. Kann mir bitte jemand helfen, diese zu verstehen? Vielen Dank.Kandidaten- und Schleifenfunktion im Schema

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

Antwort

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

ist so ziemlich syntaktischer Zucker für diese:

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

    (loop l '() 0)) 

So in einer benannten let Sie die Anfangswerte der ersten Anwendung haben zusammen mit dem Namen es mit gebunden werden soll. In dem lassen Sie es so nennen, als wäre es mit 10 gemacht und aufgerufen.

Der Name loop ist genau das. Ein Name. Sie können es beliebig nennen, aber loop ist eine Namenskonvention für tail rekursiven Code.

Scheme hat keine Schleifen- oder Iterationskonstrukte, die nicht nur eine Abstraktion sind (entweder eine Prozedur oder ein Makro), die letztendlich mit rekursiven Aufrufen iterieren.