Перевод Python в схему / ракетку - PullRequest
0 голосов
/ 12 декабря 2018

Я сейчас пытаюсь перевести этот код Python 2:

import math

def worstCaseArrayOfSize(n):
    if n == 1:
        return [1]
    else:
        top = worstCaseArrayOfSize(int(math.floor(float(n) / 2)))
        bottom = worstCaseArrayOfSize(int(math.ceil(float(n) / 2)))
        return map(lambda x: x * 2, top) + map(lambda x: x * 2 - 1, bottom)

в код ракетки / схемы, и мне трудно.

Это то, что у меня так далеко:

(define (msortWorstCase n)
  (cond
    [(equal? 1 n) 1]
    [else (let* ([top (msortWorstCase(floor (/ n 2)))] [bottom (msortWorstCase (ceiling (/ n 2)))]) 

(append (map (lambda (x) (* x 2)) (list top)) (map (lambda (x) (- (* x 2) 1)) (list bottom))))]
    )
  )

Может кто-нибудь сказать мне, где я не так с этим?

Я получаю следующую ошибку:

*: contract violation
  expected: number?
  given: '(2 1)
  argument position: 1st
  other arguments...:

1 Ответ

0 голосов
/ 12 декабря 2018

Ваша рекурсия создает списки списков списков списков ... с (list top) и (list bottom).

В Racket вы должны сделать то же самое, что и в Python;базовый случай должен быть списком из одного элемента, и вы не должны заключать результаты в списки в рекурсивном случае.

(define (msortWorstCase n)
  (cond
    [(equal? 1 n) '(1)]
    [else (let* ([top (msortWorstCase(floor (/ n 2)))] 
                 [bottom (msortWorstCase (ceiling (/ n 2)))]) 
             (append (map (lambda (x) (* x 2)) top) 
                     (map (lambda (x) (- (* x 2) 1)) bottom)))]))
...