首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >递归求根平方和

递归求根平方和
EN

Stack Overflow用户
提问于 2019-10-24 00:51:26
回答 3查看 188关注 0票数 0

我试着递归地寻找两个数组的平方根和。基本上给出了:

代码语言:javascript
运行
复制
array1 = {1,5,8};
array2 = {2,9,10};
RSS = sqrt((1-2)^2 + (2-5)^2 + (3-8)^2) = 4.58258

我已经实现了以下代码,但经过测试后,我知道它不能工作。我每次都返回平方根,所以我的RSS值比它应该的值要低。

代码语言:javascript
运行
复制
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。

我觉得我已经很接近了,但只有一个小问题。有人能帮帮我吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-10-24 01:39:32

您正在计算sqrt((1-2)^2 + sqrt((2-5)^2 +sqrt((3-8)^2)您可以通过将递归结果平方一次,对您的逻辑进行一些简单的“修复”

代码语言:javascript
运行
复制
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

所以你的方法会变成这样:

代码语言:javascript
运行
复制
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));
}

成功的关键是知道什么时候需要分离;要注意保持代码行数较少的方法有助于维护代码

票数 2
EN

Stack Overflow用户

发布于 2019-10-24 01:38:18

这就是你想要的:

代码语言:javascript
运行
复制
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);
}

用手写出数学,以确认它是正确的。

但请不要以这种方式编写实际的程序。这不仅是一种不必要的复杂方式来编写琐碎的循环,而且在每次迭代/递归时取平方根,只是为了在下一次迭代中立即撤消它,效率也非常低。即使对于下面的简单版本,末尾的单个平方根也会比其他一切加在一起花费更长的时间:

代码语言:javascript
运行
复制
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);
}
票数 1
EN

Stack Overflow用户

发布于 2019-10-24 01:32:54

我的意思是这样:

代码语言:javascript
运行
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58527630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档