2009/10/02

流行っていると聞いて - ループを使わずに1から10までの総和を表示するプログラム

 

WS000020

ループを使わずに1から10までの総和を表示するプログラム

 

とりあえずGauche(Scheme)だとこうでしょうか?

(fold (lambda (n r)
        (+ n r))
      0
      (iota 10 1))

 

それともこう?

(apply + (iota 10 1))

 

 

IronScheme

WS000019 

IronSchemeでも同じようにいけますね。IronSchemeもSRFIをフルサポートしているらしい。RSR6も数千の項目に対してサポートしていないのは残りわずか数個らしい。

(import
(rnrs)
(srfi lists)) ; srfi-1

 

(iota 10 1 2)
;; -> (1 3 5 7 9 11 13 15 17 19)

 

(apply + (iota 10 1))
;; -> 55

 

(fold (lambda (n r)
        (+ n r))
      0
      (iota 10 1))
;; -> 55

 

再帰も厳密に言えばループじゃないよね!ということで・・・

(((lambda (f)
   (f f))
(lambda (f)
   (lambda (n r)
     (if (<= n 10)
         ((f f)(+ n 1)(+ n r))
         r)))) 1 0)
;; -> 55

これはつまり

(((lambda (f)
    (lambda (n r)
      (if (<= n 10)
          ((f f)(+ n 1)(+ n r))
          r)))
  (lambda (f)
    (lambda (n r)
      (if (<= n 10)
          ((f f)(+ n 1)(+ n r))
          r))))
  1 0)

というようなことで、乱暴に言うと

((lambda (f n r)
   (if (<= n 10)
       (f f (+ n 1)(+ n r))
       r))
(lambda (f n r)
   (if (<= n 10)
       (f f (+ n 1)(+ n r))
       r))
1 0)

と似たような意味で結局は

(define f
  (lambda (f n r)
   (if (<= n 10)
       (f f (+ n 1)(+ n r))
       r)))
(f f 1 0)
;; -> 55

みたいなものということで

3 件のコメント: