Scheme 检查节点子集中是否存在单词

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 . . . . . . . . .

我正在尝试创建一个函数,它接受一个单词、一个棋盘和两个棋盘索引:一个行索引和一个列索引,如果单词存在于棋盘上,则返回true,从行ri、列ci开始,并跟踪一条只从位置ri、ci向左或向上移动的路径,就像图上的x、y一样

 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)))