2016-12-09 71 views
3

我在这一段简单的代码,构建数字列表:有没有什么办法可以使使用cons在方案中纬度?

#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)到新元素an-element延长a-list

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

会给你相应的元素按顺序。

1

已经找到了答案:

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