计算板上最短路径的数量

时间:2015-04-21 23:49:30

标签: scheme racket

我正在尝试创建一个程序,该程序可以找到nxn板上最短路径的数量。这应该使用二叉树递归。它需要两个数字来表示板上某个正方形的位置,并返回指示的正方形和左上角之间的不同最短路径的数量。而且你只能向上,向下,向左或向右移动。

  0 1 2 3 4 5 6 7 8 
0 . . . . . . . . .
1 . . . . . . . . .
2 . . . . . . . . .
3 . . . . . . . . .
4 . . . . . . x . .
5 . . . . . . . . .
6 . . . . . . . . .

在这种情况下,x位于第4行第6行。程序应计算最短路径的数量。显然,如果x在边缘上,则只有一条最短路径。

(check-expect (shortest 0 0) 0)
(check-expect (shortest 0 1) 1) 
(check-expect (shortest 1 0) 1) 
(check-expect (shortest 1 1) 2) 
(check-expect (shortest 1 2) 3) 
(check-expect (shortest 2 1) 3) 
(check-expect (shortest 2 2) 6) 
(check-expect (shortest 2 3) 10) 
(check-expect (shortest 2 7) 36) 
(check-expect (shortest 6 5) 462) 

我相信我非常接近,但在其他情况下我遇到了问题:

(define (shortest x y)
  (cond
    [(= x y 0) 0]
    [(or (zero? y) (zero? x)) 1]
    [else (+ 1 (shortest (sub1 x) y)
               (shortest x (sub1 y)))]))

我以为在其他地方会有一个if语句,但我不确定要测试什么。

这不应该有任何帮助者,lambda,本地人等等。在ISL +中。任何帮助都会很棒。

1 个答案:

答案 0 :(得分:0)

据我所知,你是否改变了

的第4行
 [else (+ 1 (shortest (sub1 x) y)

 [else (+ (shortest (sub1 x) y)

该功能应该按要求工作。所以......

(define (shortest x y)
  (cond
    [(= x y 0) 0]
    [(or (zero? y) (zero? x)) 1]
    [else (+ (shortest (sub1 x) y)
             (shortest x (sub1 y)))]))

并且不需要ifs中的ifs。