;; -*- coding: utf-8 -*-
;; ---
;; jupyter:
;;   jupytext:
;;     text_representation:
;;       extension: .scm
;;       format_name: light
;;       format_version: '1.5'
;;       jupytext_version: 1.14.4
;;   kernelspec:
;;     display_name: Calysto Scheme 3
;;     language: scheme
;;     name: calysto_scheme
;; ---

;; ### 練習問題2.18
;; リストを引数として取り、同じ要素を逆順に持つリストを返す⼿続きreverseを定義せよ。
;;
;;     (reverse (list 1 4 9 16 25))
;;     (25 16 9 4 1) 

; reverse手続きは定義済みであることに注意。
(reverse (list 1 4 9 16 25))

;;     (25 (16 (9 (4 (1 nil)))))
;;     
;; を作るイメージで実装すればよい。

;; +
; 反復プロセスによる実装
(define (reverse l)
  (define (iter result l_tmp)
    (if (null? l_tmp) result
        (iter (cons (car l_tmp) result) (cdr l_tmp))
        )
    )
  (iter '() l)
  )

; 動作確認
(reverse (list 1 4 9 16 25))

;; +
; 再帰プロセスによる実装
(define (reverse l)
  (if (null? l) '()
      (append (reverse (cdr l)) (list (car l)))
    )
  )

; 動作確認
(reverse (list 1 4 9 16 25))

;; +
; 当初考えた再帰プロセスでの実装
; →やってみたが、メモリ的にもステップ数的にも無駄な実装となっている。

; リストから最後の要素を取得する。
(define (get-last l)
  (define (iter item l_tmp)
    (if (null? l_tmp) item
        (iter (car l_tmp) (cdr l_tmp)))
    )
  (iter () l)
  )

; 動作確認
(display (get-last (list 1 4 9 16 25)))
(newline)

; リストから最後の要素を除外したリストを返す。
(define (remove-last l)
  (define (iter l1 l2)
    (if (null? l2) '()
        (cons (car l1) (iter (cdr l1) (cdr l2)))
        )
    )
  (iter l (cdr l))
  )

; 動作確認
(display (remove-last (list 1 4 9 16 25)))
(newline)

(define (reverse l)
  (define (iter l_tmp)
    (if (null? l_tmp) '()
        (cons (get-last l_tmp) (iter (remove-last l_tmp)))
        )
    )
  (iter l)
  )

; 動作確認
(reverse (list 1 4 9 16 25))

StarcoderdataJupyterScriptsDedupFiltered