2

我有这个代码:

def input1 = ['a','b','e','r','t']
input2 = ['v','n','m','y']
ans = []

def common(def element,def i) {
  if (element == input2[i]) {
    ans << element
    return
  } else {
    common(element,++i)
  }
}  

for (i=0;i<input1.size();i++) {
  common(input1[i],0)
}

这是产生堆栈溢出错误。为什么会这样?

编辑:

我正在尝试创建自己的方式来查找两个列表之间的共同元素。

4

2 回答 2

2

您永远不会检查是否i大于 的长度input2,并且在 Groovy 中,会超出 a 的List长度null

所以在第一个元素上,它将继续循环

if (element == input2[i]) {

对于不断增加的 值,每次都i调用该函数,因为它永远不会匹配commona

猜测你正在尝试做什么,这都可以重写为:

def input1 = ['a','b','e','r','t']
def input2 = ['v','n','m','y']
def ans = input1.intersect( input2 )

但是很难确定你想要什么,你也没有明确说出来。

编辑

避免堆栈溢出的一种深度递归方法是使用Groovy 的蹦床方法

def common
common = { Object element, Collection list ->
  if( list.size() == 0 ) {                     // element not found.  Return null
    null
  }
  else if( list.head() == element ) {          // element found.  Return it
    element
  }
  else {
    common.trampoline( element, list.tail() )  // Trampoline down the list and check again
  }
}
common = common.trampoline()

def elements = ['a','b','e','v','r','t'].collect { // For each element in this list
                 common( it, ['v','n','m','y'] )   // Find if it's in our other list
               }.findAll()                         // And remove the nulls

assert elements == [ 'v' ]

但是我仍然会intersect在这种情况下使用,上面只是展示了 Groovy 的一种方法,你可以避免太深的递归......

于 2012-07-26T11:36:43.170 回答
0

问题是您的代码在到达数组 input2 的末尾时不会停止。如果元素不在 input2 中,那么它将永远进行递归调用common(element,++i),这会导致堆栈溢出错误。

于 2012-07-26T11:38:09.847 回答