Работа с вложенным списком (до неизвестной степени) (Racket) - PullRequest
0 голосов
/ 30 апреля 2020

Это моя первая публикация, поэтому дайте мне знать, если я что-то напутал:)

Это назначение, где я не могу импортировать или использовать «для функций». Итак, у меня есть вложенный список, но я не знаю степень его вложенности, поэтому это может быть что-то вроде этого:

'(#<procedure:curried:tt> #<procedure:curried:tt> #<procedure:curried:tt> #<procedure:curried:tt>)
or
'((#<procedure:curried:tt> #<procedure:curried:tt> #<procedure:curried:tt> #<procedure:curried:tt>)
(#<procedure:curried:tt> #<procedure:curried:tt> #<procedure:curried:tt> #<procedure:curried:tt>)
(#<procedure:curried:tt> #<procedure:curried:tt> #<procedure:curried:tt> #<procedure:curried:tt>)
(#<procedure:curried:tt> #<procedure:curried:tt> #<procedure:curried:tt> #<procedure:curried:tt>))
or
'(((#<procedure:curried:tt> #<procedure:curried:tt> #<procedure:curried:tt> #<procedure:curried:tt>)
(#<procedure:curried:tt> #<procedure:curried:tt> #<procedure:curried:tt> #<procedure:curried:tt>)
(#<procedure:curried:tt> #<procedure:curried:tt> #<procedure:curried:tt> #<procedure:curried:tt>)
(#<procedure:curried:tt> #<procedure:curried:tt> #<procedure:curried:tt> #<procedure:curried:tt>))
((#<procedure:curried:tt> #<procedure:curried:tt> #<procedure:curried:tt> #<procedure:curried:tt>)
(#<procedure:curried:tt> #<procedure:curried:tt> #<procedure:curried:tt> #<procedure:curried:tt>)
(#<procedure:curried:tt> #<procedure:curried:tt> #<procedure:curried:tt> #<procedure:curried:tt>)
(#<procedure:curried:tt> #<procedure:curried:tt> #<procedure:curried:tt> #<procedure:curried:tt>))
((#<procedure:curried:tt> #<procedure:curried:tt> #<procedure:curried:tt> #<procedure:curried:tt>)
(#<procedure:curried:tt> #<procedure:curried:tt> #<procedure:curried:tt> #<procedure:curried:tt>)
(#<procedure:curried:tt> #<procedure:curried:tt> #<procedure:curried:tt> #<procedure:curried:tt>)
(#<procedure:curried:tt> #<procedure:curried:tt> #<procedure:curried:tt> #<procedure:curried:tt>))
((#<procedure:curried:tt> #<procedure:curried:tt> #<procedure:curried:tt> #<procedure:curried:tt>)
(#<procedure:curried:tt> #<procedure:curried:tt> #<procedure:curried:tt> #<procedure:curried:tt>)
(#<procedure:curried:tt> #<procedure:curried:tt> #<procedure:curried:tt> #<procedure:curried:tt>)
(#<procedure:curried:tt> #<procedure:curried:tt> #<procedure:curried:tt> #<procedure:curried:tt>)))
or
4 times bigger then that

Примечание: хотя это не обязательно по факторам из 4

Затем я должен применить один аргумент к каждой из функций, без изменения их позиции в списке, поэтому приведенные выше функции могут оказаться:

'(1 2 3 4)
and
'((1 2 3 4)
(1 2 3 4)
(2 3 4 5)
(9 8 2 1))
and
'(((1 2 3 4)
(1 2 3 4)
(2 3 4 5)
(9 8 2 1))
((1 2 3 4)
(1 2 3 4)
(2 3 4 5)
(9 8 2 1))
((1 2 3 4)
(1 2 3 4)
(2 3 4 5)
(9 8 2 1))
((1 2 3 4)
(1 2 3 4)
(2 3 4 5)
(9 8 2 1)))
and so on

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

1 Ответ

1 голос
/ 30 апреля 2020

Это в основном похоже на прохождение s-выражения. Вы можете смоделировать данные как s-выражение:

; NestedFuncs is one of
; - Func
; - [List-of Nested-Funcs]

Как только это будет сделано, его легко обойти. Одна функция для обработки данных, а вторая - для обхода списка.

#lang racket

(define (apply-nfs nfs arg)
  (if (list? nfs)
      (apply-nf-list nfs arg)
      (nfs arg)))

(define (apply-nf-list nf arg)
  (if (empty? nf)
      '()
      (cons (apply-nfs (car nf) arg)
            (apply-nf-list (cdr nf) arg))))

Вот пример и вывод:


(define nf-ex
  `((,add1 ,sub1 ,sub1 ,add1)
    (,sub1 (,add1 ,add1) ,add1 ,sub1)
    (,add1 ,add1)
    (,add1 ,add1 (,sub1 (,add1)) ,add1)))

(apply-nfs nf-ex 3)
; => '((4 2 2 4) (2 (4 4) 4 2) (4 4) (4 4 (2 (4)) 4))
...