sicp學習 迷宮

2022-02-24 04:39:11 字數 2423 閱讀 4631

很簡單的問題,最笨的演算法,自己第乙個用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 過程作為黑箱的抽象...