Как получить наименьшее целое число из вектора в ракетке - PullRequest
0 голосов
/ 21 октября 2018

Я пытаюсь получить наименьшее целое число из вектора, содержащего только цифры.Я знаю, как это сделать со списками.Вы сравниваете первые два значения списка и в зависимости от того, какое из них больше, вы либо сохраняете свое значение, чтобы вывести его позже, либо снова вызываете функцию с остальной частью списка (все элементы, кроме первого), используя cdr процедура.

Но с векторами я полностью потерялся.Я думаю, что мышление о решении будет одинаковым для списков и векторов.Я читал на веб-сайте racket-lang, но не смог найти решение проблемы.Процедуры, над которыми я экспериментировал больше всего: vector-ref и vector-length , так как они кажутся наиболее полезными в этой задаче (но я впервые работаю с векторамитак что я знаю).

Итак, мои два вопроса:

  1. Как мы можем получить все значения, кроме первого, из вектора?Есть ли такая процедура, как cdr , но для векторов?

  2. Если бы вы работали со списками, вы бы использовали cons для сохранения значений, которые вы быхочу выводить.Но есть ли подобный способ сделать это при работе с векторами?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

Векторы имеют O (1) доступ и индексируются, так что это совершенно другая структура данных, однако у вас есть SEFI-43, который похож на библиотеку списков SRFI-1, но для векторов.

#lang racket
(require srfi/43)

(define (min-element lst)
  (vector-fold min (vector-ref lst 0) lst))

(max-element #(7 8 1 2 3 4 5 12))
; ==> 1
0 голосов
/ 21 октября 2018

Самое простое решение - использовать вариант for, называемый for/fold.Я думал, что есть for/min, но, увы.

#lang racket
(define v (vector 11 12 13  4 15 16))

(for/fold ([m +inf.0]) ([x (in-vector v)])
  (min m x))

Если вам нравится более явный подход:

(define (vector-min xs)
  (define n (vector-length xs))
  (let loop ([i 0]           ; running index
             [m +inf.0])     ; minimum value so far
    (cond
      [(= i n)               ; if the end is reached
       m]                    ;     return the minimum
      [else                  ; else
       (define x (vector-ref v i)) ; get new element in vector
       (loop (+ i 1)         ;   increment index
             (min m x))])))  ;   new minimum

ОБНОВЛЕНИЕ

(let loop ([x 1] [y 10])
   (loop (+ x 1) (- y 1))

- то же самоекак:

(let ()
   (define (loop (x y) 
     (loop (+ x 1) (- y 1)))
   (loop 1 10))
...