ProgrammingのTipなど

再帰

再帰関数とは自分自身を呼び出すことで繰り返し処理をするアルゴリズムです
Schemeでは何らかの繰り返し処理を扱うには
高階関数を使うか再帰を使うことが多いです
再帰関数の書き方
再帰関数の書き方は条件分岐を使って終了条件を定めて使うのが一般的です
でないと無限ループになってしまいます
次は書き方の一つの例に過ぎません
他にも様々な書き方ができます
( define 関数名 (if (条件判定) 戻り値 (関数名 (- 引数 1) ) )



再帰による累乗の計算
(define (fact n) (if (= n 0) 1 (* n (fact (- n 1)))))

(print (fact 5))
>>120

上記のlambda関数バージョン
(define fact
  (lambda (n)
    (if (= n 0) 1 (* n (fact (- n 1))))))

(print (fact 3))
再帰を使った累乗の例2

(define fact (lambda (n)
                (cond
                  ((eq? n 1) 1)
                  (else
                   (* n (fact (- n 1))))
                  )
                )
  )
(print (fact 5))

再帰を使ったループの例1
(define (recFunc n nmax func) 
             (if (> n nmax) 
                  n 
                  (begin
                     (func n)
                     (recFunc (+ n 1) nmax func)
                     )
                )
)
(recFunc 1 5 print)
>>1,2,3,4,5

再帰によるリストの処理

再帰を使ってリストの数に全て1を足す例
(define plus1 (lambda (l)
                (cond
                  ((null? l) (quote ()))
                            (else          
                             (cons (+ (car l) 1) (plus1 (cdr l)))
                             )
                            )
                  )
                )
 
(define l1 '(1 2 3 4 5))
(print (plus1 l1))
>'(2 3 4 5 6)
再帰によるリストの長さを返す関数例
(define list-length (lambda (l)
                      (if (null? l) 0
                         (+ (list-length(cdr l)) 1))
                      )
  )
(define l1 '(1 2 3 4 5 6 7))
(print (list-length l1))
置き換え関数
(define replace1
  (lambda (new old l)
  (cond
    ((null? l) (quote ()))
    (else
      (cond
        ((eq? old (car l)) (cons new (cdr l)))
        (else
         (cons (car l) (replace1 new old (cdr l)))
         )
        )
      )
    )
  )
)

(define l1 '(1 2 3 4 5))

(replace1 10 3 l1)

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu

メニュー2

開くメニュー

閉じるメニュー

  • アイテム
  • アイテム
  • アイテム
【メニュー編集】

管理人/副管理人のみ編集できます