偶然间发现
与Scheme共舞中一个小小的bug,原文如下:
... ...
而下面的树也可以用列表直观表达:(A B C (D (F H) G) E)。也就是说,每个列表表示一个树或子树。列表的第一个元素是根。
在处理树状数据时,我们往往需要知道树的最大深度(最大深度也叫树的高度)。一个节点的深度等于该节点到根节点间的路径数。下图中的树最大深度为3, 路径是A->D->F->H。现在我们写一个函数来计算一棵树的深度。
。。。 。。。
原文所附的算法如下(Scheme):
然而这个算法只适用于普通的情况,以下三种情况就无法处理(正常处理):
1. 只有一个节点的树,(1),返回值为1,貌似正确高度为0;
2. 空树,() ,程序出错
3. 不同的表达方式,(1 2) 等价于 (1 (2)),这种情况下的返回值就变成了2,而不是1
树的深度的算法是一个基于归纳的递归,之所以会产生如上问题,就是处理递归方程有些问题,下面是一种可能的解法:
... ...
而下面的树也可以用列表直观表达:(A B C (D (F H) G) E)。也就是说,每个列表表示一个树或子树。列表的第一个元素是根。
在处理树状数据时,我们往往需要知道树的最大深度(最大深度也叫树的高度)。一个节点的深度等于该节点到根节点间的路径数。下图中的树最大深度为3, 路径是A->D->F->H。现在我们写一个函数来计算一棵树的深度。
。。。 。。。
原文所附的算法如下(Scheme):
ruby 代码
- (define (tree-depth tree)
- (cond
- ((list? tree) (+ 1 (apply max (map tree-depth tree))))
- (else 0)))
然而这个算法只适用于普通的情况,以下三种情况就无法处理(正常处理):
1. 只有一个节点的树,(1),返回值为1,貌似正确高度为0;
2. 空树,() ,程序出错
3. 不同的表达方式,(1 2) 等价于 (1 (2)),这种情况下的返回值就变成了2,而不是1
树的深度的算法是一个基于归纳的递归,之所以会产生如上问题,就是处理递归方程有些问题,下面是一种可能的解法:
ruby 代码
- (define (tree-depth tree)
- (cond
- ((and (pair? tree) (pair? (cdr tree))) (+ 1 (apply max (map tree-depth (cdr tree)))))
- (else 0)))
- (tree-depth '(1 2)) ; 1
- (tree-depth '(1 (2))) ; 1
- (tree-depth '(1 2 3 (4 (5 6) 7) 8)) ;3
- (tree-depth ()) ;0
- (tree-depth '(1)) ;0