2017-04-18 29 views
0

我想从具有双递归的方法返回一个列表(BST,二叉搜索树)。我想实现它如下:使用递归与球拍返回列表

(define (mapBST BST someFunct) 
    (cond 
    [(null? BST) 
    '()] 
     [else (cons (car BST) (someFunct (car (cdr BST)))) (mapBST (car (cdr (cdr BST))) someFunct) (mapBST (car (cdr (cdr (cdr BST)))) someFunct) ] 

) 
) 

调用此方法与此代码小片段

(define bst 
      '(3 "3" 
        (1 "1" 
        () 
        (2 "2"()()) 
       ) 
        (5 "5"()()) 
      ) 
) 
(mapBST bst string->number) 

我也试过这个片段,但它返回((()())())

[else (printf (car (cdr BST))) (cons (mapBST (car (cdr (cdr BST))) someFunct) (mapBST (car (cdr (cdr (cdr BST)))) someFunct)) ] 

的结果应该返回相同的BST,但使用数字而不是字符串作为值。

+0

显示您要调用的代码,它生成的内容以及您期望生成的内容。正确缩进代码,在新行上启动每个子表达式。提示:在'[else A B C]'中,'A'和'B'没有效果 - 它们的值被忽略,只返回最后一个值。 –

回答

0

在你的else表达式中,你没有正确重构二叉搜索树,这就是为什么你得到一个空列表。您else情况下更改为

... 
[else 
(cons (car BST) 
     (cons (someFunct (car (cdr BST))) 
      (cons (mapBST (car (cdr (cdr BST))) someFunct) 
        (cons (mapBST (car (cdr (cdr (cdr BST)))) someFunct) empty))))] 
... 

... 
[else 
(list (car BST) 
     (someFunct (car (cdr BST))) 
     (mapBST (car (cdr (cdr BST))) someFunct) 
     (mapBST (car (cdr (cdr (cdr BST)))) someFunct))] 
... 

将解决您的问题(这两个选项产生相同的名单,因为(cons 1 (cons 2 empty))相当于(list 1 2))。

这里是mapBST完全更新:

(define (mapBST proc BST) 
    (cond 
    [(null? BST) empty] 
    [else 
    (list (car BST) 
      (proc (cadr BST)) 
      (mapBST proc (caddr BST)) 
      (mapBST proc (cadddr BST)))])) 

例如,

(define BST '(3 "3" (1 "1"() (2 "2"()())) (5 "5"()()))) 
(mapBST string->number BST) 
=> '(3 3 (1 1() (2 2()())) (5 5()())) 
0

正如另一个答案指出的那样,你实际上并没有返回你是else子句中你认为什么。修复这将使您的程序工作。然而,这种类型的人在过去的六十年代曾经习惯编写Lisp,并且正确地让Lisp变成了一个不好的名字,因为它是完全不透明的。使用像caddr这样的东西比较好,但只是稍微有点(它们的语言提供了多少呢?我永远不会记得)。不过更好的,如果你的数据在概念上的列表,是利用函数名,像first & second,因为他们说什么,你居然意味着(如果你的数据在概念conses之外的一棵树,然后car & c是更好的可能)。但他们仍然有'本周有多少人'的问题。

正确的解决方案是使用解构& /或模式匹配来根据数据的形状绑定变量。这使你的代码真正清晰。球拍有一个全面的机制,我不是很了解细节,但我知道足够让我通过。这里是你的功能(固定)版本,它使用match做的工作:

(define (map-bst bst fn) 
    (match bst 
    ['() '()] 
    [(list 1st 2nd 3rd 4th) 
    (list 1st 
      (fn 2nd) 
      (map-bst 3rd fn) 
      (map-bst 4th fn))] 
    [_ (error "botch")])) 

(注意,这可能会提供更好的变量名做:我不知道是什么结构的各个位的意思)。