YarЬ, без динамического программирования обычной рекурсией алгоритм вычисления определителя N-го порядка может выглядеть примерно так:
class Matrix
 def initialize(n)
  @rows,@n=Array.new,n
  for i in 0..@n
   column=Array.new
   for j in 0..@n
    column.push(0)
   end
   @rows.push(column)
  end
 end
 def [](x,y)
  return @rows[y][x]
 end
 def []=(x,y,value)
  @rows[y][x]=value
 end
 def calculateDeterminant
  if @n==2 then
   a1=self[0,0];a2=self[0,1];b1=self[1,0];b2=self[1,1]
   return a1*b2-a2*b1
  else
   j,determinant=0,0
   for i in 0..@n
    ai=self[i,j]
    if ai!=0 then
     sign=(i+j)%2==0?1:-1
     aai=buildSubmatrix(i,j).calculateDeterminant
     determinant+=sign*ai*aai
    end
   end
   return determinant
  end
 end
 def buildSubmatrix(x,y)
  submatrix=Matrix.new(@n-1)
  k=0
  for i in 0..@n
   if i!=x then
    l=0
    for j in 0..@n
     if j!=y then
      submatrix[k,l]=self[i,j]
      l+=1
     end
    end
    k+=1
   end
  end
  return submatrix
 end
end
Как видно из алгоритма (но нереализовано в нём), сокращение количества вычисляемых миноров обеспечивается поиском строки с наибольшим количеством нулей и пропусканием этих нулей при расчёте. Количество нулей можно увеличивать преобразованиями, но тогда задача сведётся к приведению матрицы к треугольному виду (о чём 
Вад говорил) и вычислению ранга более простым способом.