c++ - 递归求根平方和
问题描述
我试图递归地找到两个数组的平方和。基本上给出:
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。
我觉得我很接近,但只是有一个小问题。有人可以帮我吗?
解决方案
您正在计算 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));
}
成功的关键是何时知道你需要分开;当心保留较少行的方法有助于维护代码
推荐阅读
- bash - 测试文本文件的最后一列标题是否相等
- html - 如何使用 Angular Reactive 表单绑定/更改以下 HTML 按钮下拉列表
- xml - 使用 Beautiful Soup 解析 XML 的问题
- c# - MSAL 要求用户在每次登录 WPF 桌面应用程序时征得用户同意
- navigator - 从抽屉导航器中反应本机传递值
- vue.js - 在 v-for 循环中动态调用对象属性
- python - 使用 .strip() 从 python 中的 .txt 文件读取的行列表中删除“\n”
- javascript - 从 Jquery 访问 Javascript 对象
- reactjs - useState() 做双重渲染
- javascript - 从对象数组中获取唯一值