Racket - กรองจำนวนเต็มคู่และจำนวนคี่ออกเป็นสองรายการแยกกัน

ฟังก์ชันควรรับรายการจำนวนเต็มและส่งคืนรายการที่มีรายการย่อยสองรายการ รายการแรกประกอบด้วยเลขคู่จากรายการเดิม รายการที่สองประกอบด้วยเลขคี่ รหัสของฉันทำงานได้สำเร็จ แต่ถ้าฉันทดสอบด้วยจำนวนเต็มลบ เช่น -5 ในการทดสอบครั้งที่สอง รหัสของฉันก็จะไม่สนใจมันเลย มีความคิดเห็นเกี่ยวกับวิธีการแก้ไขหรือไม่?

(หมายเหตุด้านข้าง - ฉันรู้ว่ามีฟังก์ชันสำหรับเลขคู่ คี่ ฯลฯ แต่สำหรับงานมอบหมายนี้ ฉันจะสร้างมันขึ้นมาเอง)

(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 แหล่งที่มา
comment
คุณเคยดู partition?   -  person Alex Knauth    schedule 03.10.2017
comment
เตือนความจำว่าจำนวนลบหารด้วย 2 นั้นเป็น ลบ (ไม่ใช่ 1;)   -  person rsm    schedule 03.10.2017
comment
อาจซ้ำกันของ วิธีแยกรายการออกเป็นสองส่วนใน โครงการ   -  person Sylwester    schedule 03.10.2017


คำตอบ (1)


ลองแทนที่ modulo แทน remainder

ส่วนที่เหลือจะคงเครื่องหมายของคำตอบไว้ (ส่วนที่เหลือของ -1 ไม่ตรงกับค่าของ 1 ที่คุณกำลังตรวจสอบ)

โมดูโล่ส่งกลับคำตอบที่มีเครื่องหมายเดียวกับตัวส่วน

person Wes Lord    schedule 03.10.2017
comment
จากคำตอบของ @ rsm ฉันได้เพิ่มตรรกะเพิ่มเติมให้กับคำสั่ง if ของฉันซึ่งใช้งานได้ แต่การเปลี่ยน 'ส่วนที่เหลือ' เป็น 'โมดูโล' เป็นแนวคิดที่สะอาดที่สุด ขอบคุณทุกคน. - person Brian Jay; 03.10.2017