もうひとつのScheme入門 7.繰り返し の練習問題4 letrec

letrecの練習問題といた。なかなかなかなかとっつきにくい関数だなと思った。
ついでにletrecの役立つ話とかをついでにリンク。
1243. Re. 1242. Re. Scheme 入門 7. 繰り返し
【scheme】letrecで階乗
scheme, Gauche: let、let*、letrec

ソースコードと実行結果

4-a

(define (my-reverse-letrec lst)
  (letrec ((iter (lambda (lst0  result-lst)
		   (if (null? lst0)
		     result-lst
		     (iter (cdr lst0) (cons  (car lst0) result-lst))))))
    (iter lst ())))

実行結果

(my-reverse-letrec '(1 2 3 4 5 6))
(6 5 4 3 2 1)
(my-reverse-letrec '())
()

4-b

(define (my-sum-letrec lst)
  (letrec ((iter (lambda (lst0 sum)
		   (if (null? lst0)
		     sum
		     (iter (cdr lst0) (+ (car lst0) sum))))))
    (iter lst 0)))

実行結果

(my-sum-letrec '(10 20 30 40 50))
150
(my-sum-letrec '())
0

4-c

(define (my-string-to-integer-letrec str)
  (letrec ((iter (lambda (lst0 result-num)
		   (if (null? lst0)
		     result-num
		     (iter (cdr lst0) 
			   (+ (- (char->integer (car lst0)) 48)
			      (* result-num 10)))))))
    (iter (string->list str) 0)))

実行結果

(my-string-to-integer-letrec "1234567890")
1234567890
(my-string-to-integer-letrec "")
0