使用嵌套列表(未知程度)(球拍)

Working with nested-list (to unknown degree) (Racket)

这是我第一次发帖,所以如果我搞砸了请告诉我:)

这是一个我无法导入或使用的作业 "for functions"。所以我有一个嵌套列表,但我不知道它嵌套的程度,所以它可能是这样的:

'(#<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 循环。老实说,我不知道如何开始 未知学位 部分,所以非常感谢您的帮助!

这基本上就像遍历一个 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))