我需要一些帮助解决这个问题。我必须使用递归对二维数组中的所有整数求和。以下是我自己设法做的事情,但我被困住了。此代码生成总和14,应为18。
public class tablerecursion {
public static void main(String[] args) {
int[][] tabell = new int[][] { { 1, 2, 3 }, { 3, 2, 1 }, { 1, 2, 3 } };
int sum = rec(tabell, 2, 2);
System.out.println(sum);
}
static int rec(int[][] table, int n, int m) {
if (m == 0)
return table[n][0];
if (n == 0)
return table[0][m];
System.out.println("n:" + n + " m:" + m);
return rec(table, n - 1, m) + rec(table, n, m - 1);
}
}
有什么建议吗?基本情况是错的吗?或者递归方法是错误的?
答案 0 :(得分:3)
我会用两个函数解决这个问题。首先创建一个可递归求和单个(1d)数组的函数。写一个函数,递归地将前一个函数与外部数组相加。
请记住,表[N]本身就是一个数组。您无需一次性访问它。
答案 1 :(得分:2)
您的递归逻辑错误。
你得到14因为你打电话
f(2,2)= f(2,1)+ f(1,2)=(f(2,0)+ f(1,1))+(f(1,1)+ f( 0,2))
f(0,2)是你的基本情况,3 f(0,2)是你的基本情况,1 f(1,1)= f(0,1)+ f(1,0)= 2 + 3 = 5
所以总和是3 + 1 + 5 + 5 = 14
用于递归的正确逻辑是单个递归函数:
以坐标(x,y)开头并以(z,w)结尾的2x2数组的总和是3件事的总和:
xxxxxxxxxx
xxxxxxxxxx
xxxxxxxxxx
yyyyyyyyyN
包含除最后一行之外的所有行的数组的总和(上例中的xxxx-s) 所以(x,y)到(z,2-1)。
一个由LAST行组成的数组的总和(右下角除外 - 例如yyyyy-s) 所以,(x,w)到(z-1,w)
坐标处的数字(z,w)
基本情况是,如果y> w(零线),则总和为零; 如果x
这实际上是一个双递归,理想情况下。一个是通过使用辅助“添加一行”函数递归计算所有行的总和 - 当然也是递归实现的。
答案 2 :(得分:0)
其他几个答案建议使用1D例程对列和2D阵列角落中元素相邻的行进行求和
BUT
将2D数组切割成四个较小的2D数组并以这种方式递归同样有效。当输入是1x1 2D数组时,停止条件当然是答案很简单。
跟进
除非阵列尺寸为2 ^ m x 2 ^ m,否则会遇到障碍;其他任何事情,迟早你遇到Nx1或1xN输入,你根本无法将其切割成四个子阵列。所以你最终还是不得不处理一维输入。
答案 3 :(得分:0)
请参阅此处是我要提交的内容,并指出递归解决方案不适用:
public static void Main()
{
var a = new int[][] { new int[] {1,2,3},
new int[] {3,2,1},
new int[] {1,2,3} };
int result = a.Sum(row => row.Sum());
Console.WriteLine(result);
}
最好是正确而不是简单地认为正确。
答案 4 :(得分:0)
以下是可能解决方案的示例。如果java编译器可以优化尾递归那么它将与迭代解决方案一样高效。现在它非常积极地吃堆栈。
public static long countSum (int[][] matrix) {
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
return 0;
}
return countSum (matrix, 0, 0, 0, matrix.length, matrix[0].length);
}
private static long countSum (int[][] matrix, long acc, int curI, int curJ, int maxI, int maxJ) {
if (curI >= maxI) {
return acc;
}
if (curJ >= maxJ) {
return countSum(matrix, acc, curI + 1, 0, maxI, maxJ);
}
return countSum(matrix, acc + matrix[curI][curJ], curI, curJ + 1, maxI, maxJ);
}
答案 5 :(得分:0)
public int sumarmatriz(int matriz[][],int i,int j)
{
if(i==0 && j==0){
return matriz[i][j];
}
else if(j==0){
return sumarmatriz(matriz,i-1,matriz.length-1)+matriz[i][j];
}
else{
return sumarmatriz(matriz,i,j-1)+matriz[i][j];
}
}
答案 6 :(得分:0)
如果您想一次访问所有内容,我认为您需要这种方法:
public class Array {
public static void main(String[] args){
int[][] A = {{1,2,3,4},{1,2,3,4},{1,2,3,4},{1,2,3,4}};
System.out.print(TwoDSum(A,4,4));
}
public static int TwoDSum(int A[][], int n,int m) {
if(n==1 && m==1) return A[0][0];
if(m==0){
n--;
m=A[n].length;
}
return TwoDSum(A,n,m-1)+A[n-1][m-1];
}
}