0

我有一个不起作用的二分法(递归实现)问题。程序在输入 a&b 值后就崩溃了......

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#define e 0.0001
#define dbg 1
using namespace std;
double f(double x){
    return x*x*x-x-2;
}
double bisection(double a,double b){
    double x1;
    x1=(b+a)/2;
    if(x1>e){
        if(f(b)*f(x1)<0)
        {
            a=x1;
        }
        else
        if(f(a)*f(x1)<0)
            b=x1;
        bisection(a,b);
        }
    return x1;
}
int main () {
    int a,b;
    double root;
    printf("a=");
    scanf("%d",&a);
    printf("b=");
    scanf("%d",&b);
    if(f(a)*f(b)<0){
        root=bisection(a,b);
        printf("root %g",root);
    }

    system("pause");
    return 0;
}

我试图显示一些调试消息,但我无法弄清楚。

4

1 回答 1

0

正如@Gene 指出的那样,您永远不会使用递归调用的结果。此外,您返回的只是 a&b 之间的中点,您不需要递归即可找到。(有关的?)

请注意,如果if用于更改递归调用的 a 或 b 的 2 s 都失败了,那么您将使用未更改的 a & b ==> 无限递归值进行递归调用,这是获得段错误的可靠方法。

于 2014-01-08T14:25:08.180 回答