Racket - Filter bilangan bulat genap dan ganjil ke dalam dua daftar terpisah

Fungsi harus mengambil daftar bilangan bulat dan mengembalikan daftar yang berisi dua subdaftar -- yang pertama berisi bilangan genap dari daftar asli, yang kedua berisi bilangan ganjil. Kode saya menyelesaikan pekerjaannya, tetapi jika saya mengujinya dengan bilangan bulat negatif, seperti -5 pada pengujian kedua, kode saya mengabaikannya. ada ide bagaimana cara memperbaikinya?

(Catatan tambahan - Saya tahu ada fungsi untuk genap, ganjil, dll, tetapi untuk tugas ini saya harus membuatnya sendiri.)

(define (segregate lst)
  (list(pullEven lst)(pullOdd lst)))

(define (pullEven lst)
    (if (empty? lst)
         '()
    (if (isEven (first lst))
     (cons (first lst) (pullEven (rest lst)))
     (pullEven (rest lst)))))

(define (pullOdd lst)
    (if (empty? lst)
         '()
    (if (isOdd (first lst))
     (cons (first lst) (pullOdd (rest lst)))
     (pullOdd (rest lst)))))

(define (isEven x)
  (if (equal? (remainder x 2) 0) #t #f)
  )
(define (isOdd x)
  (if (equal? (remainder x 2) 1) #t #f)
  )

;tests
"---------------------------------------------"
"Segregate Tests"
(segregate '(7 2 3 5 8)) 
(segregate '(3 -5 8 16 99))
(segregate '())
"---------------------------------------------"

person Brian Jay    schedule 03.10.2017    source sumber
comment
Sudahkah Anda melihat partition?   -  person Alex Knauth    schedule 03.10.2017
comment
pengingat bilangan negatif dibagi 2 adalah negatif (jadi bukan 1;)   -  person rsm    schedule 03.10.2017
comment
Kemungkinan duplikat Cara membagi daftar menjadi dua bagian di Skema   -  person Sylwester    schedule 03.10.2017


Jawaban (1)


Coba gantikan modulo bukannya remainder.

Sisanya akan mempertahankan tanda jawaban (sisa -1 tidak cocok dengan nilai 1 yang Anda periksa).

Modulo mengembalikan jawaban dengan tanda yang sama dengan penyebutnya.

person Wes Lord    schedule 03.10.2017
comment
Berdasarkan jawaban @ rsm saya menambahkan lebih banyak logika ke pernyataan if saya -- yang berhasil, tetapi mengganti 'sisa' ke 'modulo' adalah ide yang paling bersih. Terimakasih semuanya. - person Brian Jay; 03.10.2017