You are likely recalculating the same cell multiple times. For example, let's say you have a 3x3 grid where all cells are 1. You will calculate `count(a, 1, 1)` twice: once as part of `count(a, 0, 1)`, and once as part of `count(a, 1, 0)`. You should instead keep track of those values you have calculated so far, and return those where available. For example: static int count(int a[][], int i, int j) { return count(a, i, j, new int[a.length][a[0].length]); } static int count(int a[][], int i, int j, int[][] results) { if (results[i][j] != 0) { return results[i][j]; } int rows = a.length; int cols = a[0].length; int ret; if(a[i][j] == 0) ret = 0; else if (i == rows - 1 && j == cols - 1) ret = a[i][j]; else if (i == rows - 1) ret = a[i][j + 1]; else if (j == cols - 1) ret = a[i + 1][j]; else if (a[i][j] == 1) ret = count(a, i + 1, j, results) + count(a, i, j + 1, results); else ret = 0; results[i][j] = ret; return ret; }