C+中使用递归的矩阵行列式+;和C# 使用C++计算矩阵行列式: int pw(int a){ if(a%2==0)return 1;else return -1; } float det(vector<vector<float> > &arr, int rows){ vector<vector<float> > arr2; float dett=0,hk; if(rows==2){ dett= (arr[0][0]*arr[1][1]-arr[0][1]*arr[1][0]); } else { for(int i=0;i<rows;i++){ hk=arr[0][i];arr2=arr; arr2.erase(arr2.begin()); for(int k=0;k<rows-1;k++)arr2[k].erase(arr2[k].begin()+i); dett=dett+pw(i)*hk*det(arr2,rows-1); } } return dett; }
C+中使用递归的矩阵行列式+;和C# 使用C++计算矩阵行列式: int pw(int a){ if(a%2==0)return 1;else return -1; } float det(vector<vector<float> > &arr, int rows){ vector<vector<float> > arr2; float dett=0,hk; if(rows==2){ dett= (arr[0][0]*arr[1][1]-arr[0][1]*arr[1][0]); } else { for(int i=0;i<rows;i++){ hk=arr[0][i];arr2=arr; arr2.erase(arr2.begin()); for(int k=0;k<rows-1;k++)arr2[k].erase(arr2[k].begin()+i); dett=dett+pw(i)*hk*det(arr2,rows-1); } } return dett; },c#,c++,C#,C++,arr2=arr语句在两种语言中执行不同的操作 在C++中,它复制数据,以便对 ARR2的更改不会改变 ARR < /代码> .< 在C#中,此作业将更新arr2所指内容,而无需复制。因此,对arr2的更改也将更改arr。您需要显式复制arr的arr2=arr语句在两种语言中执行不同的操作 在C++中,它复制数据,以便对 ARR2的更改不会改变 ARR < /代码> .< 在C#中,此作业将更新arr2所指内容,而无需复制。因此,对arr2的更改也将更改arr。您需要显式复制arr 我检查循环到
arr2=arr代码>语句在两种语言中执行不同的操作
在C++中,它复制数据,以便对<代码> ARR2的更改不会改变<代码> ARR < /代码> .<
在C#中,此作业将更新arr2
所指内容,而无需复制。因此,对arr2
的更改也将更改arr
。您需要显式复制arr
的arr2=arr代码>语句在两种语言中执行不同的操作
在C++中,它复制数据,以便对<代码> ARR2的更改不会改变<代码> ARR < /代码> .<
在C#中,此作业将更新
arr2
所指内容,而无需复制。因此,对arr2
的更改也将更改arr
。您需要显式复制arr
我检查循环到达I=1时,递归开始时,“arr”不相同
是的,这是因为您使用的是不复制列表的arr2=arr
,arr2
仍然是对arr
的引用。您可以做的是arr2=新列表(arr)
创建包含arr
元素的新列表
编辑
要在列表中复制列表,可以执行以下操作。
arr2=新列表(arr.Select(x=>newlist(x))代码>
我检查循环到达I=1时,递归开始时,“arr”不相同
是的,这是因为您使用的是不复制列表的arr2=arr
,arr2
仍然是对arr
的引用。您可以做的是arr2=新列表(arr)
创建包含arr
元素的新列表
编辑
要在列表中复制列表,可以执行以下操作。
arr2=新列表(arr.Select(x=>newlist(x))代码>“不工作”不是对问题的有用描述为什么要先使用和后使用。只需执行arr[0][0]
。另外,最后< /Cord>不一定是C++代码中寻找的第二个项目。@ JuHARR语句由计数检查来保护。“所以C?S.吸吮?或者我的代码中有什么错误?”因为您说“但是在C中它不工作。”只留下一个结论……“ARR假设不改变,但是递归开始时它是变化的。”如果执行此操作并对arr2
进行更改,则会更改arr
,因为您不复制矩阵,而只将引用分配给它。两个元素仍然指向同一个对象!另外,如果递归开始,那么您有一个不同的对象,它的行数比您传递到递归调用的行数少一行,那么您为什么想知道,“不工作”不是一个问题的有用描述,为什么您要使用First
和Last
。只需执行arr[0][0]
。另外,最后< /Cord>不一定是C++代码中寻找的第二个项目。@ JuHARR语句由计数检查来保护。“所以C?S.吸吮?或者我的代码中有什么错误?”因为您说“但是在C中它不工作。”只留下一个结论……“ARR假设不改变,但是递归开始时它是变化的。”如果执行此操作并对arr2
进行更改,则会更改arr
,因为您不复制矩阵,而只将引用分配给它。两个元素仍然指向同一个对象!同样,如果递归开始,那么您有一个不同的对象,它的行数比您传入递归调用的行数少一行,那么您为什么会感到奇怪呢?这似乎是正确的。但是,当我不能在c#中使用“=”时,我究竟如何制作副本?这似乎是正确的。但是,当我不能在c#中使用“=”时,我究竟如何制作副本?就像你说的,当使用new时,它保持delete arr。这是不可能的@minh你是什么意思?你还必须在foreach
中复制k
。复制列表内部的简单方法就是这样做<代码>arr2=新列表(arr.Select(x=>新列表(x))代码>好的。它起作用了。多谢各位。但老实说,现在我开始讨厌C了如你所说,当使用新功能时,它会保持删除arr。这是不可能的@minh你是什么意思?你还必须在foreach
中复制k
。复制列表内部的简单方法就是这样做<代码>arr2=新列表(arr.Select(x=>新列表(x))代码>好的。它起作用了。多谢各位。但老实说,现在我开始讨厌C了
int pw(int a)
{
if (a % 2 == 0) return 1; else return -1;
}
double det(List<List<double>> arr)
{
int rows = arr.Count;
List<List<double>> arr2;
double dett = 0, hk;
if (rows == 2)
{
dett = (arr.First().First() * arr.Last().Last() - arr.First().Last() * arr.Last().First());
}
else
{
for (int i = 0; i < arr.Count; i++)
{
hk = arr[0][i]; arr2 = arr;
arr2.RemoveAt(0);
foreach (List<double> k in arr2) k.RemoveAt(i);
dett = dett + pw(i) * hk * det(arr2);
}
}
return dett;
}