在准备我关于函数式编程的讨论时,我有一个简单的链接列表实现,其中获取长度的方法就是这样。
# base class List
# class EmptyList < List
def length
0
end
# class NonEmptyList < List
# this class has a @head and a @tail attributes
def length
1 + @tail.length
end
length
类的NonEmptyList
方法的实现看起来像递归函数。我认为不是因为我在另一个实例上调用length
,即使其他实例属于同一个类列表。
如果这是递归的,请告诉我。此外,如果获得长度的解决方案消耗过多的调用堆栈,是否存在任何性能问题。
答案 0 :(得分:2)
是的,这是递归的。您应该将this
(或调用函数的对象,无论语法如何)视为与任何其他函数参数一样......递归函数不需要使用完全相同的参数调用自身在每个递归调用上都是递归的(事实上,如果确实如此,它将永远不会停止递归)。类似地,在这里,你在做道德等同于将参数更改为函数,这不会使函数递归得更少。
当且仅当在某些情况下,它可以直接或间接地调用自身时,函数是递归的。它调用自身的一组特定参数(或上下文)与定义无关。