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

この関数は私が書いたものですが、単純な再帰と繰り返しを使用して、これをより明確に表現するにはどうすればよいでしょうか?

申し訳ありませんが、作成関数を定義するのを忘れていました。

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

また、この関数は、f と正の整数 n を計算する手続きを入力として取り、f の n 回目の繰り返し適用を計算する手続きを返します。

4

3 に答える 3

1

(繰り返し 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)))
于 2008-11-10T02:59:42.620 に答える
1
(define (repeated f n)
  (lambda (x)
    (let recur ((x x) (n n))
      (if (= n 0)
          args
          (recur (f x) (sub1 n))))))

引数が 2 段階で渡されることを除いて、通常どおりに関数を記述します。次のように定義すると、さらに明確になる可能性があります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' を使用する必要はありません。また、ラムダにより、引数が 2 段階であると予想されることが明らかになります。(注: 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)

これが宿題の問題ではないことを願っています。

于 2008-11-10T03:03:01.337 に答える
0

好奇心から、あなたの関数何をしようとしていますか? 走るfのはn何回ですか?もしそうなら、あなたはこれを行うことができます。

(define (repeated f n)
  (for-each (lambda (i) (f)) (iota n)))
于 2008-11-10T02:07:03.430 に答える