我试着递归地寻找两个数组的平方根和。基本上给出了:
array1 = {1,5,8};
array2 = {2,9,10};
RSS = sqrt((1-2)^2 + (2-5)^2 + (3-8)^2) = 4.58258我已经实现了以下代码,但经过测试后,我知道它不能工作。我每次都返回平方根,所以我的RSS值比它应该的值要低。
double findRSS(int* array1, int* array2, int size){
double sum = 0;
if (size <= 0){
return 0; }
else{
sum = pow((array1[size-1] - array2[size-1]), 2);
sum = sum + findRSS(array1, array2, size-1);
}
return sqrt(sum);
}在上面的例子中,我返回了2.85011。
我觉得我已经很接近了,但只有一个小问题。有人能帮帮我吗?
发布于 2019-10-24 01:39:32
您正在计算sqrt((1-2)^2 + sqrt((2-5)^2 +sqrt((3-8)^2)您可以通过将递归结果平方一次,对您的逻辑进行一些简单的“修复”
double findRSS(int* array1, int* array2, int size){
double sum = 0;
if (size <= 0){
return 0; }
else{
sum = pow((array1[size-1] - array2[size-1]), 2);
sum = sum + pow(findRSS(array1, array2, size-1), 2); // you are undoing sqrt for new one
}
return sqrt(sum);
}但正如您所看到的,该方法是有缺陷的。这是一个很好的例子,说明了为什么结构化开发很重要。你可以在这里找到开发人员发现很久的原则:http://www.catb.org/~esr/writings/taoup/html/ch01s06.html
所以你的方法会变成这样:
double diffSum(int* array1, int* array2, int size, int power) {
double sum = 0;
if (size <= 0) {
return 0;
}
else {
sum = pow((array1[size - 1] - array2[size - 1]), power);
sum = sum + diffSum(array1, array2, size - 1, power);
}
return sum;
}
double findRSS(int* array1, int* array2, int size) {
return sqrt(diffSum(array1, array2, size, 2));
}成功的关键是知道什么时候需要分离;要注意保持代码行数较少的方法有助于维护代码
发布于 2019-10-24 01:38:18
这就是你想要的:
double findRSS(int* array1, int* array2, int size){
double sum = 0;
if (size <= 0){
return 0; }
else{
sum = pow((array1[size-1] - array2[size-1]), 2);
sum = sum + pow(findRSS(array1, array2, size-1), 2);
}
return sqrt(sum);
}用手写出数学,以确认它是正确的。
但请不要以这种方式编写实际的程序。这不仅是一种不必要的复杂方式来编写琐碎的循环,而且在每次迭代/递归时取平方根,只是为了在下一次迭代中立即撤消它,效率也非常低。即使对于下面的简单版本,末尾的单个平方根也会比其他一切加在一起花费更长的时间:
double findRSS(int* array1, int* array2)
{
double sum = 0;
for (int i = 0; i < size; ++i)
sum += std::pow(arra1[i] - array2[i], 2);
return std::sqrt(sum);
}发布于 2019-10-24 01:32:54
我的意思是这样:
int findRSS(int *arr1, int *arr2, int size)
{
if (size == 0)
return 0;
return (int)pow(arr1[size - 1] - arr2[size - 1], 2) + findRSS(arr1, arr2, size - 1);
}
int main()
{
int arr1[] = { 1, 5, 8 };
int arr2[] = { 2, 9, 10 };
cout << sqrt(findRSS(arr1, arr2, 3)) << endl;
}https://stackoverflow.com/questions/58527630
复制相似问题