我有这个代码,我为计算以下系列而编写:
让我解释一下这个问题:我们输入整数n和长双x。现在,该函数计算上述基数的值。
代码是:
//嵌套的sqrt函数
#include <iostream>
#include <math.h>
using namespace std;
long double seq( unsigned long, long double, unsigned long = 0 );
int main() {
unsigned long n = 0;
long double x;
cout << "Enter integer n: ";
cin >> n;
cout << "Enter x: ";
cin >> x;
cout << seq( n, x);
return 0;
}
long double seq( unsigned long n, long double x, unsigned long i = 0 ) {
long double res = 0;
if( i == n) {
return res;
}
else {
res = sqrt( pow( x, i) + sqrt( seq(n, x, i+1)));
}
}
代码没有执行,并且显示函数的类型错误,但是我给函数传递了正确的类型。
这是我得到的错误:
In function 'long double seq( long unsigned int, long doublem long unsigned int)':
nested.cpp:25:70: error default argument given for parameter 3 of 'long double seq(...)' [-fpermissive]
nested.cpp:8:13: error: after previous specification in 'long double seq(...)' [-fpermissive]
另外,我的方法是否正确解决了这个问题?
修改的 我无法评论,但我所说的是偏好bean(谢谢!)给出了答案,以消除错误。但现在一个问题更深层,这个代码实际上并没有提供所需的结果。我输入n = 10且x = 2,输出 nan 。对于我输入的任何x或n值,输出为nan。请告诉我在创建函数时出错的地方。
谢谢大家,这是一个小错误,你们都慷慨地指出:正如lutzl所说,我改变了if条件,并且删除了两个平方根。你是对的,之前它非常不正确,因为它增加了额外的sqrt功能。 res也是多余的。谢谢。
答案 0 :(得分:3)
您只能提供参数默认一次。
我会将其保留在声明中,但请将定义中的unsigned long i = 0
更改为unsigned long i
。
如果你愿意,你可以反过来做,但我真的不明白这一点。
答案 1 :(得分:2)
如果i != n
,您不会在函数中返回任何内容。试试这个:
long double seq( unsigned long n, long double x, unsigned long i = 0 ) {
if( i > n) {
return 0.0;
}
else {
return sqrt( pow( x, i) + seq(n, x, i+1));
}
}
答案 2 :(得分:2)
如果您想获得正确的结果,请使用
long double seq( unsigned long n, long double x, unsigned long i) {
return sqrt( pow(x,i)+(i==n?0:seq(n,x,i+1)) );
}
要避免使用power函数,请使用递归
long double seq( unsigned long i, long double x, long double xpow) {
return sqrt( xpow+(i==0?0:seq(i-1,x,xpow*x)) );
}
称为seq(n,x,1)
。或者再次隐藏默认参数中的1
。