【问题标题】:Recursion on deep list scheme深度列表方案的递归
【发布时间】:2014-12-01 16:06:00
【问题描述】:

我创建了一个函数,它接受一个列表作为输入并返回一个列表或一个原子。我想将此函数应用于深层列表,从内部列表开始,然后在函数在外部列表上运行后完成。

有人可以给我一些指导吗?

样本输入将是 (a b (c (d e))) z) 函数应首先在 (d e) 上计算结果为 f。那么该函数应该在 (c f) 上计算结果为 say g 然后类似地在 (a b g z) 上计算以产生 h 的输出。

一个示例函数可以是:

(define sum
 (lambda (l)
  (if (not (pair? l))
   0
   (+ (car l) (sum (cdr l))))))

输入为 (1 2 (3 4) 5) > 15

【问题讨论】:

  • 请发布您目前编写的代码,包括示例输入和预期输出,准确概述您的实现问题出在哪里
  • 样本输入将是 (a b (c (d e)))) 函数应首先在 (d e) 上计算,结果为 f。然后该函数应该在 (c f) 上计算结果为 g 然后类似地在 (a b g) 上计算以产生 h 的输出。我无法粘贴我的代码,因为它是用于家庭作业的。
  • @user234234 看看stackoverflow.com/q/5699899/23567,它解决了类似的问题。没有任何代码,人们更不愿意提供帮助。
  • @seogaard 感谢您迄今为止的帮助,我很感激没有我的代码可能很难给我答案。我查看了您发布的问题,但在问题中,该函数是在列表的每个元素上计算的,而不是整个列表。您能否建议对此答案进行修改?
  • 模仿map-deep的结构。

标签: scheme racket


【解决方案1】:

假设您的示例转换,表示为 Scheme 过程:

(define (transform lst)
  (case lst
    (((d e)) 'f)
    (((c f)) 'g)
    (((a b g z)) 'h)
    (else (error (~a "wot? " lst)))))

那么你正在寻找的似乎是

(define (f lst)
  (transform
   (map (lambda (e) 
          (if (list? e) (f e) e))
        lst)))

测试:

> (f '(a b (c (d e)) z))
'h

【讨论】:

    【解决方案2】:

    这是一个例子:

    (define product
      (lambda (l)
        (cond
          [(number? l) l]
          [(pair? l)   (* (product (car l)) (product (cdr l)))]
          [else        1])))
    
    > (product '(1 2 (3 4) 5))
    120
    

    【讨论】:

    • 非常感谢您的帮助,但是我希望映射已经定义的函数,例如sum 或其他函数添加到深度列表。
    猜你喜欢
    • 2015-02-04
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2017-02-20
    相关资源
    最近更新 更多