Как мне вернуть список строк из списка списков? - PullRequest
1 голос
/ 23 сентября 2019

Вопрос домашнего задания следующий ...

(10 баллов) Напишите функцию разнесения, которая, учитывая список кортежей, (nx), создает новый список, вставляя x в список n развместо (nx) (другими словами, вставленные элементы должны располагаться в том же порядке, что и исходные кортежи при создании нового списка).Вы можете предположить, что n всегда будет по крайней мере 0.

(explode '((2 "Hello"))) производит -> ("Hello", "Hello")

(explode '((2 "Hello") (3 "world"))) производит -> ("Hello" "Hello" "world" "world" "world")


Возможное решение, о котором я думал до сих пор, заключалось в том, чтобы иметь цикл, который бы отслеживал, над каким кортежем в данный момент работает алгоритм, а затем внутри этого цикла было определение функции, которое вызывалось бы рекурсивно, чтобы добавить строку в список возврата.,Но я не уверен, что это сработает, потому что кажется, что это потребует использования 'set!'Профессор сказал, что нам нельзя использовать.

Я не ищу полного ответа, так как это домашнее задание.Я просто хотел бы указать в правильном направлении, как решить эту проблему, возможно, с помощью некоторого кода sudo.

Спасибо всем!

Ответы [ 3 ]

1 голос
/ 23 сентября 2019
  1. что производит explode пустого списка?
  2. что производит explode из '((2 "Hello") (3 "world")))?
  3. что производит explode из '((3 "world"))?
  4. Как вы можете перейти от # 3 к # 2?

Как вы можете "объединить" результат # 3 (рекурсивный вызов на CDR) с '(2 "Hello") (машинасписка), чтобы получить результат # 2?

Вы можете предположить , что у вас есть результат рекурсивного вызова при построении функции "combin" (функция объединения может быть рекурсивнойтоже).

0 голосов
/ 23 сентября 2019

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

#lang racket
(define(explode tuples)
  (flatten
   (map
    (lambda (tuple)
      (let*
          ([repeat-n-times (range  (first tuple))]
           [value (second tuple)])
        (map (λ _ value) repeat-n-times)))
    tuples)))
0 голосов
/ 23 сентября 2019

Разделите это на две задачи:

Во-первых, напишите функцию expand, которая работает следующим образом:

(expand 3 "world") => ("world" "world" "world"))

Во-вторых, реализуйте explode, чтобы она вызывала expandна каждый из его аргументов и добавляет результаты вместе в один список.

(explode '(x y z ...)) => 
    (append (expand (first x) (second x)) 
            (expand (first y) (second y))
            (expand (first z) (second z))
            ...)

Обе функции могут быть рекурсивными.Базовый случай для expand - это когда первый элемент списка равен 0.Базовый случай для explode - это когда список пуст.Вам необходимо выяснить, как объединить текущий результат с рекурсивным вызовом, чтобы получить правильный результат для каждой проблемы.

...