【问题标题】:How would I express this Scheme function more clearly?我如何更清楚地表达这个 Scheme 功能?
【发布时间】:2008-11-10 00:52:18
【问题描述】:
(define (repeated f n)
   if (= n 0)
   f
   ((compose repeated f) (lambda (x) (- n 1))))

我写了这个函数,但是我如何更清楚地表达这个,使用简单的递归和重复?

对不起,我忘了定义我的 compose 函数。

(define (compose f g) (lambda (x) (f (g x))))

该函数将计算 f 和正整数 n 的过程作为输入,并返回计算 f 的第 n 次重复应用的过程。

【问题讨论】:

  • 你测试过这个功能吗?它目前是否按照您认为的那样做?
  • 抱歉没说清楚,我更新了帖子。

标签: lisp scheme


【解决方案1】:

我假设 (repeated f 3) 应该返回一个函数 g(x)=f(f(f(x)))。如果这不是你想要的,请澄清。无论如何,重复的定义可以写成:

(define (repeated f n)
  (lambda (x)
    (if (= n 0)
        x
        ((repeated f (- n 1)) (f x))))) 

(define (square x)
  (* x x))

(define y (repeated square 3))

(y 2) ; returns 256, which is (square (square (square 2)))

【讨论】:

    【解决方案2】:
    (define (repeated f n)
      (lambda (x)
        (let recur ((x x) (n n))
          (if (= n 0)
              args
              (recur (f x) (sub1 n))))))
    

    按照通常的方式编写函数,除了参数分两个阶段传递。用这种方式定义repeated 可能会更清楚:

    (define repeated (lambda (f n) (lambda (x) 
      (define (recur x n)
        (if (= n 0)
            x
            (recur (f x) (sub1 n))))
      (recur x n))))
    

    您不必以这种方式使用“let-loop”,而 lambda 表达式清楚地表明您期望您的参数分两个阶段。 (注意:recur 不像 Clojure 那样内置在 Scheme 中,我只是喜欢这个名字)

    > (define foonly (repeat sub1 10))
    > (foonly 11)
    1
    > (foonly 9)
    -1
    

    你想要的很酷的功能特性是柯里化,而不是组合。这是带有隐式柯里化的 Haskell:

    repeated _ 0 x = x
    repeated f n x = repeated f (pred n) (f x)
    

    我希望这不是作业问题。

    【讨论】:

      【解决方案3】:

      出于好奇,您的函数试图做什么?是运行fn 次吗?如果是这样,您可以这样做。

      (define (repeated f n)
        (for-each (lambda (i) (f)) (iota n)))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-05
        • 1970-01-01
        • 2015-10-09
        • 1970-01-01
        相关资源
        最近更新 更多