2016-12-09 15 views
3

У меня этот простой кусок кода, построения списка номеров:Есть ли способ сделать лат, используя минусы в схеме?

#lang scheme 

(define pseudofizzbuzz (lambda (x) 
      (cond 
       ((zero? x) (quote())) 
       ((or (integer? (/ x 3)) (integer? (/ x 5))) (cons (quote()) (pseudofizzbuzz (- x 1)))) 
       (else (cons x (pseudofizzbuzz (- x 1))))))) 

(define reverselist (lambda (lat) 
        (cond 
        ((null? lat) (quote())) 
        (else 
        (cons (reverselist (cdr lat)) (list (car lat))))))) 


(reverselist (pseudofizzbuzz 10)) 

И результат я получаю:

((((((((((() 1) 2)()) 4)())()) 7) 8)())()) 

Но то, что я хочу, конечно, является:

(1 2 4 7 8) 

Есть ли способ сделать это в схеме? Я использую DrRacket.

ответ

1

Используйте (cons an-element a-list) расширить a-list с новым элементом an-element:

#lang racket 

(define pseudofizzbuzz 
    (lambda (x) 
    (cond 
     ((zero? x) 
     (quote())) 
     ((or (integer? (/ x 3)) (integer? (/ x 5))) 
     (pseudofizzbuzz (- x 1))) 
     (else 
     (cons x (pseudofizzbuzz (- x 1))))))) 

(define reverselist 
    (lambda (lat) 
    (cond 
     ((null? lat) 
     (quote())) 
     (else   
     (cons (reverselist (cdr lat)) (list (car lat))))))) 

(pseudofizzbuzz 10) 

Это производит результаты в обратном порядке, так

(reverse (pseudofizzbuzz 10)) 

даст вам элементы в ct порядок.

1

Уже нашел ответ:

(define (flatten x) 
    (cond ((null? x) '()) 
      ((not (pair? x)) (list x)) 
      (else (append (flatten (car x)) 
         (flatten (cdr x)))))) 

 Смежные вопросы

  • Нет связанных вопросов^_^