Пытаясь заставить этот код работать, не могу понять, куда вводить аргумент, и продолжаю получать ошибки - PullRequest
1 голос
/ 24 марта 2019

Определите функцию iota1 (n, m), которая принимает положительные целые числа n, m с n

Я пытался переключать код несколько раз, но не могу заставить его работать и правильно отображать список

(define (iota1 n m)
  (if (eq? n 0)
      '()
      (append (iota1 (< n m) (+ n 1)) (list n))))

Ответы [ 2 ]

2 голосов
/ 24 марта 2019

В предоставленном вами коде есть несколько странностей, которые я отформатировал для удобства чтения:

(define (iota1 n m)
  (if (eq? n 0)
      '()
      (append (iota (< n m) (+ n 1))
              (list n))))

Во-первых, выражение (< n m) оценивается как логическое значение в зависимости от того, меньше ли n m или нет. Когда вы применяете iota к (< n m) в выражении (iota (< n m) (+ n 1)), вы даете iota логическое значение для первого аргумента вместо положительного целого числа.

Во-вторых, использование append здесь странно. При построении списка в Racket гораздо чаще используется функция cons, которая принимает в качестве аргументов значение и список и возвращает новый список со значением, добавленным вперед. Например,

(append '(3) (append '(4) (append '(5) '()))) ==> '(3 4 5)
(cons 3 (cons 4 (cons 5 '())))                ==> '(3 4 5)

Рекомендуется использовать cons вместо append, потому что это проще и быстрее, поскольку cons не пересекает весь список, как append.

Поскольку это звучит как домашняя задача, я оставлю вам «шаблон кода», чтобы помочь вам найти ответ:

; n : integer
; m : integer
; return value : list of integers
(define (iota1 n m)
  (if (> n m)                  ; base case; no need to do work when n is greater than m
      ...                      ; value that goes at the end of the list
      (cons ...                ; the value we want to add to the front of the list
            (iota1 ... ...)))) ; the call to iota, generating the rest of the list
1 голос
/ 26 марта 2019

Добро пожаловать в мир ракеток, моя версия здесь:

#lang racket

(define (iota1 n m)
  (let loop ([loop_n n]
             [result_list '()])
    (if (<= loop_n m)
        (loop
         (add1 loop_n)
         (cons loop_n result_list))
        (reverse result_list))))
...