为什么我实现的Mandelbrot集合递归程序只输出无意义内容?
问题核心原因
你的代码存在多处关键错误,递归逻辑、参数类型、输出逻辑都存在问题:
- 参数类型错误:
Mandelbrot_equation函数的Zn参数定义为double类型,但后续对Zn的赋值、cabs求模、复数运算都是针对复数类型的操作,类型不匹配导致计算结果完全错误,需要将Zn的类型改为double complex。 - 递归返回值缺失:递归调用
Mandelbrot_equation后没有写return语句,导致函数最终返回值是未定义的随机值,自然无法得到正确的判断结果。 - 换行逻辑异常:原main函数中判断
x == 0.9触发换行的逻辑存在浮点数精度问题,浮点数连续累加0.1会存在精度误差,大概率无法匹配到正好等于0.9的情况,改为内层x循环结束后直接打印换行更可靠。 - 额外优化点:使用
cpow(Zn, 2)计算平方效率很低,直接写Zn * Zn即可实现复数平方运算,性能更高也更易读。
修正后的完整代码
#include <stdio.h> #include <math.h> #include <complex.h> #define N_MAX 12 int Mandelbrot_equation (double x, double y, int n, double complex Zn) { if (cabs(Zn) >= 2 || n >= N_MAX) return n; if (n == 0) { Zn = 0; } else { Zn = Zn * Zn + x + I * y; } return Mandelbrot_equation(x, y, n + 1, Zn); } int main(int argc, char const *argv[]) { // 调整坐标范围适配曼德博集合的标准显示区域,可按需修改步进值调整精度 for (double y = 1.0; y > -1.5; y -= 0.1) { for (double x = -2.0; x < 1.0; x += 0.05) { if (Mandelbrot_equation(x,y,0,0) == N_MAX) { printf("."); } else { printf(" "); } } printf("\n"); } return 0; }
内容的提问来源于stack exchange,提问作者newbiecoder42
相关产品推荐
相关产品推荐

