1. 程式人生 > >挑戰程式設計競賽 演算法和資料結構 第6章 遞迴和分治法

挑戰程式設計競賽 演算法和資料結構 第6章 遞迴和分治法

仿照上述程式碼,本人編寫的C語言AC程式碼如下:
//ALDS1_5_C:Koch Curve
//2一個很致命的問題,將遞迴中的 s,t;區域性變數寫成全域性變數
//深刻感覺遞迴,還需要時間的積累。2017-9-29 AC
#include <stdio.h>
#include <math.h>
struct Point{
    double x,y;
}p1,p2;//2寫成 p1,p2,s,t;
int n;
void koch(int step,struct Point a,struct Point b){
    double th=M_PI*60/180;//弧度形式的60度
    struct Point s,u,t;//2一個很致命的問題,將遞迴中的 s,t;區域性變數寫成全域性變數
    if(step==0)return;
    s.x=(2*a.x+b.x)/3;
    s.y=(2*a.y+b.y)/3;
    t.x=(a.x+2*b.x)/3;
    t.y=(a.y+2*b.y)/3;
    u.x=(t.x-s.x)*cos(th)-(t.y-s.y)*sin(th)+s.x;
    u.y=(t.x-s.x)*sin(th)+(t.y-s.y)*cos(th)+s.y;
    koch(step-1,a,s);//1 此處寫成 koch(n-1,a,s);
    printf("%.8f %.8f\n",s.x,s.y);
    koch(step-1,s,u);//1 此處寫成 koch(n-1,s,u);
    printf("%.8f %.8f\n",u.x,u.y);
    koch(step-1,u,t);//1 此處寫成 koch(n-1,u,t);
    printf("%.8f %.8f\n",t.x,t.y);
    koch(step-1,t,b);//1 此處寫成  koch(n-1,t,b);
}
int main(){
    p1.x=0,p1.y=0;
    p2.x=100,p2.y=0;
    scanf("%d",&n);
    printf("%.8f %.8f\n",p1.x,p1.y);
    koch(n,p1,p2);
    printf("%.8f %.8f\n",p2.x,p2.y);
    return 0;
}

2017-9-29 AC該章節