protected double kernelHelper(int n,char[] s,int endIndexS,char[] t,int endIndexT){
  if (n <= 0) {
    return getReturnValue(n);
  }
  if (Math.min(endIndexS + 1,endIndexT + 1) < n) {
    return getReturnValue(n);
  }
  int adr=0;
  if (m_useRecursionCache) {
    adr=m_multX * n + m_multY * endIndexS + m_multZ * endIndexT;
    if (cachekhK[adr % maxCache] == adr + 1) {
      return cachekh[adr % maxCache];
    }
  }
  double result=0;
  result=m_lambda * kernelHelper(n,s,endIndexS - 1,t,endIndexT) + kernelHelper2(n,s,endIndexS,t,endIndexT);
  if (m_useRecursionCache) {
    cachekhK[adr % maxCache]=adr + 1;
    cachekh[adr % maxCache]=result;
  }
  return result;
}

protected double kernelHelper ( int n , char [ ] s , int endIndexS , char [ ] t , int endIndexT ) { if ( n <= 0 ) { return getReturnValue ( n ) ; } if ( Math . min ( endIndexS + 1 , endIndexT + 1 ) < n ) { return getReturnValue ( n ) ; } int adr = 0 ; if ( m_useRecursionCache ) { adr = m_multX * n + m_multY * endIndexS + m_multZ * endIndexT ; if ( cachekhK [ adr % maxCache ] == adr + 1 ) { return cachekh [ adr % maxCache ] ; } } double result = 0 ; result = m_lambda * kernelHelper ( n , s , endIndexS - 1 , t , endIndexT ) + kernelHelper2 ( n , s , endIndexS , t , endIndexT ) ; if ( m_useRecursionCache ) { cachekhK [ adr % maxCache ] = adr + 1 ; cachekh [ adr % maxCache ] = result ; } return result ; }
the kernel helper function , called k ' in [ 1 ] and [ 2 ] .
