#include
int main(void){
int djq(int a,int b);
int x,n;
float p;
scanf("%d,%d",&n,&x);
if(n>=0){
switch(n){
case 0:p=1;break;
case 1:p=x;break;
default:p=djq(n,x);break;
}
printf("%.2f",p);
}
else
printf("error");
return 0;
}
int djq(int n,int x){
float p;
switch(n){
case 0:p=1;break;
case 1:p=x;break;
default:p=((2*n-1)*x-djq(n-1,x)-(n-1)*djq(n-2,x))/n;break;
}
return p;
}
该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
这个程序的输出结果为 -3 而不是 -3.5 是因为使用整数除法导致精度丢失。在 djq
函数的最后,计算式子 (2*n-1)*x-djq(n-1,x)-(n-1)*djq(n-2,x))/n
时,如果 n 的值为 3,那么计算的结果将是 (5*x - djq(2,x) - 2*djq(1,x)) / 3
,而 djq(2,x) 的值为 3,djq(1,x) 的值为 x,所以 (5*x - djq(2,x) - 2*djq(1,x)) / 3
的值实际上是 (5*x - 3 - 2*x) / 3
,即 (3*x - 3) / 3
,结果为 x - 1,而不是正确的结果 x - 1.5。
解决这个问题的方法是在计算式子时将整数转换为浮点数,这样就可以进行浮点数除法,避免精度丢失。修改后的 djq
函数如下:
float djq(int n, int x) {
float p;
switch(n) {
case 0: p = 1; break;
case 1: p = x; break;
default: p = ((2.0*n-1)*x-djq(n-1,x)-(n-1)*djq(n-2,x))/n; break;
}
return p;
}
这样就可以正确输出 -3.5 了。
如果以上回答对您有所帮助,点击一下采纳该答案~谢谢
不知道你这个问题是否已经解决, 如果还没有解决的话:typedef int SLTDataType; typedef struct SListNode { SLTDataType data; struct SListNode* next; }SLTNode;
这个结构很简单,这里不过多赘述,上文的例子都是这种结构,不太理解的同学可以结合代码和上文图片在纸上画一画。