【问题标题】:scheme define list as local variable方案将列表定义为局部变量
【发布时间】:2019-09-17 07:20:56
【问题描述】:

我的目标是将列表定义为局部变量,以便从中获取最大元素。我的代码:

#lang racket
(define (f a b c)
    (list (+ (* a a) (* b b) (* c c)) (+ a c))
    (define (max-of-list-2 lst)
      (foldr max (first lst) (rest lst)))
  (max max_from_list 12))
(f 5 6 7)

在第二行中,我定义了带有计算值的列表。我的目标是将它传递到下一行,以便从中获取最大数量,最后从列表的最大值和 12 中获取最大值。我做错了什么。如何处理?

【问题讨论】:

  • 用另一个定义命名它:(define lst (list ...))。然后您可以在任何 lisp 表达式中按名称引用它,例如一个函数调用。
  • 但我无法调用 (max max-of-list-2 (lst) 12)
  • @IntoTheDeep (max (max-of-list-2 lst) 12) 怎么样? @IntoTheDeep
  • @IntoTheDeep 我们很难获取您的非工作代码并制定出您的实际意图。你能更好地描述这个问题吗?你能想出比f 更好的名字吗?返回值应该是多少? (* a a) (* b b) (* c c)(+ a c) 值的意义何在?这只是一个任务吗?

标签: functional-programming scheme max racket fold


【解决方案1】:

您可以在函数顶部使用几个 defines。

你的意思是

(define (f a b c)
  (define lst (list (+ (* a a) (* b b) (* c c)) 
                    (+ a c)))
  (define (max-of-list-2 lst)
      (foldr max (first lst) (rest lst)))
  (max (max-of-list-2 lst) 12))

但这只是等价于

(define (f a b c)
  (foldr max 12 (list (+ (* a a) (* b b) (* c c)) 
                      (+ a c))))

【讨论】:

    【解决方案2】:

    您需要使用内部定义,如下所示:

    (define (f a b c)
        (define max_from_list (list (+ (* a a) (* b b) (* c c)) (+ a c)))
        (define (max-of-list-2 lst)
          (foldr max (first lst) (rest lst)))
      (max max_from_list 12))
    

    【讨论】:

      【解决方案3】:

      弄清楚你的意图有点困难,但这是我能想到的最好的理解-

      (define (max a b)
        (if (< a b)
            b
            a))
      
      (define (f a . more)
        (if (empty? more)
            (max a 12)
            (max a (apply f more))))
      
      (f 5 6 7)
      ; => 12
      
      (f 5 20 30)
      ; => 30
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-04-08
        • 2011-06-15
        • 2017-01-26
        • 1970-01-01
        相关资源
        最近更新 更多