很簡單的問題,最笨的演算法,自己第乙個用scheme寫的稍微算長點的程式.
廢話不多說,直接上**.
(begin(load "ex2.scm")
(define (make-maze)
(define (for-each proc things)
(cond ((null? things) nil)
(else
(let ((ret (proc (car things))))
(if (null? ret) (for-each proc (cdr things)) ret)))))
;迷宮(define maze '((1 1 1 1 1 1 1 1 1)
(1 0 1 0 0 0 1 0 1)
(1 0 1 0 1 0 1 0 1)
(1 0 1 0 1 0 1 0 1)
(1 0 0 0 0 0 0 0 1)
(1 1 1 1 1 1 1 1 1)))
(define direction '((0 -1)(0 1)(-1 0)(1 0))) ;
上下左右
(define (get-x-y array-2d x y)
(list-ref (list-ref array-2d x) y))
(define (is-close cur path)
;是否已經走過的路
(= 1(accumulate
(lambda (pos sum)
(if (and (= (car pos) (car cur)) (= (cadr pos) (cadr cur))) (+ sum 1) sum))
0path)))
;檢查是否合法路徑
(define (check cur dir path)
(let ((x (+ (car dir) (car cur)))
(y (+ (cadr dir) (cadr cur))))
(cond ((is-close (list x y) path) nil)
((= (get-x-y maze x y) 1) nil);
阻擋 (else (list x y))))) ;
返回下一步合法的座標
;返回一條路徑
(define (find-path-one start target)
(define (iter cur-step path)
(define (move dir)
(let ((next (check cur-step (list-ref direction dir) path)))
(cond ((null? next) nil)
(else (iter next (cons cur-step path))))))
(if (and (=(car target) (car cur-step))
(=(cadr target) (cadr cur-step))) (cons cur-step path)
(for-each move (enumerate-interval 0 3)))
)(reverse (iter start nil))
);返回所有路徑
(define (find-path-all start target)
(define (iter cur-step path)
(define (move dir)
(let ((next (check cur-step (list-ref direction dir) path)))
(cond ((null? next) nil)
(else (iter next (cons cur-step path))))))
(cond ((and (= (car target) (car cur-step)) (=(cadr target) (cadr cur-step)))
(list (cons cur-step path)))
;到達目的地,返回路勁
(else
)(map reverse (iter start nil))
)(lambda (op start target)
(cond ((eq? op 'find-path-all) (find-path-all start target))
((eq? op 'find-path-one) (find-path-one start target))
(else "bad op"))
)) );
(define maze make-maze)
;(maze 'find-path-one '(1 1) '(1 7))
SICP學習筆記(1 1 4 1 1 5)
sicp學習筆記 1.1.4 1.1.5 周銀輝 書接上一回,這裡是我在學習1.1.4 1.1.5時的一些筆記 1,標準過程與復合過程 以 scheme為例,作為一門語言,其內建了一些原始過程 或稱之為標準的過程 與scheme環境中,比如,實際上與某個內建過程關聯 繫結 了起來,該過程接收兩個引數...
SICP學習筆記(1 1 1 1 1 3)
sicp學習筆記 1.1.1 1.1.3 周銀輝 sicp,即structure and interpretation of computer programs,電腦程式的構造和解釋,是mit 麻省理工學院 一門經典課程,相信很多程式愛好者都讀過,最近我也抽空讀了讀,挺有意思的。算是對大學知識 高數...
SICP學習筆記(一)
一直在斷斷續續地看sicp,確實字字珠璣,今天總算看了前兩章,習題做了一部分,不過日後肯定還是要回頭重看的,現在略微回頭總結一下。1 好的程式語言應提供的三種機制 基本表示式 組合 抽象 實際上我們自己也可以為特定問題制定自己的 語言 是否具有上述能力是這個語言是否強大的關鍵 2 過程作為黑箱的抽象...