Scheme 检查节点子集中是否存在单词
我正在尝试创建一个函数,它接受一个单词、一个棋盘和两个棋盘索引:一个行索引和一个列索引,如果单词存在于棋盘上,则返回true,从行ri、列ci开始,并跟踪一条只从位置ri、ci向左或向上移动的路径,就像图上的x、y一样Scheme 检查节点子集中是否存在单词,scheme,racket,Scheme,Racket,我正在尝试创建一个函数,它接受一个单词、一个棋盘和两个棋盘索引:一个行索引和一个列索引,如果单词存在于棋盘上,则返回true,从行ri、列ci开始,并跟踪一条只从位置ri、ci向左或向上移动的路径,就像图上的x、y一样 0 1 2 3 4 5 6 7 8 0 . . . . . . . . . 1 . . . . . . . . . 2 . . . . . . . . . 3 . . . . . . . . . 4 . . . . . . . . . 5 . . . . . . . . .
0 1 2 3 4 5 6 7 8
0 . . . . . . . . .
1 . . . . . . . . .
2 . . . . . . . . .
3 . . . . . . . . .
4 . . . . . . . . .
5 . . . . . . . . .
6 . . . . . . . . .
#|
A Board is one of:
– empty
– (cons [ListOf X] Board) -board-cols items long
[ListOf X] is board-rows items long
board? : X -> Bool
make-board : Nat Nat X -> Board
|#
(define-struct board [rows cols content])
如果需要,这应该在ISL+中只有一个助手,但没有其他局部变量、助手、lambda、let等,并且应该是二叉树递归
我相信我很快就能解决这个问题,但我一直只通过了一些检查。以下是我所做的:
;returns a character at the location
;this function doesn't count as a helper
(define (board-ref b row col)
(if (or (< (board-rows b) row) (< (board-cols b) col)) false
(string-ref (list-ref (board-content b) row) col)))
; find? : String Board Row Col -> Bool
(define (find? w b ri ci)
(local [(define (help w b ri ci n)
(cond
[(= n (sub1 (string-length w))) true]
[else
(and (equal? (string-ref w n) (board-ref b ri ci))
(or (equal? (string-ref w n) (help w b (sub1 ri) ci (add1 n)))
(equal? (string-ref w n) (help w b ri (sub1 ci) (add1 n)))))]))]
(help w b ri ci 0)))
任何帮助都会大有帮助 您有三个问题看起来像:
[(= n (sub1 (string-length w))) true]
如果您尝试运行find,会发生什么?q b0 0?这显然应该失败,但事实并非如此。您过早地声明了一个匹配字符。这意味着单个字符串随处可见。只要想想一个字符的情况;字符串长度q为0。您可以通过调用帮助来启动递归,其中n为0
想想你会如何向别人解释代码。如果当前字符匹配,或者递归调用成功,或者对左侧的递归调用成功,则返回true
每次调用都需要匹配当前字符串ref w n。或者与两个递归调用一起使用;你不在乎哪一个成功,你只需要其中一个成功
(if (or (< (board-rows b) row)
(< (board-cols b) col))
false
(string-ref (list-ref (board-content b) row) col)))
当你点击顶部或左侧边缘时会发生什么情况,而你仍然有你正在寻找的字母?行和列将变为负数,然后list ref和string ref将不高兴。在你对soegaard的评论中,你说递归应该上升到0,0。但到底是什么阻止了你呢?你需要解释和跟踪一条只向左或向上移动的路径。添加到解释中。左边是sub1 ri,上面是sub1 ci,直到在图上达到0,0。修复了else语句,但仍然不确定基本情况。我进一步阐述了剩余问题。
(or (equal? (string-ref w n) (board-ref b ri ci))
(help w b (sub1 ri) ci (add1 n))
(help w b ri (sub1 ci) (add1 n)))]))]
(if (or (< (board-rows b) row)
(< (board-cols b) col))
false
(string-ref (list-ref (board-content b) row) col)))