Vấn đề tối ưu code bài tính tổng và tìm max trong float array

Mình có câu trong đề thi là viết hàm tính tổng và tim max trong Float Array bằng đệ qui nhưng lại ghi là tối ưu code cho toàn bài (2 điểm điểm nếu bài tối ưu)
mình thấy rõ là với đơn giản vậy thì đê qui nặng hờn châm hờn chiếm nhiều stack hơn mà , thành ra minh viết luôn vòng lặp for ->trư điểm ghi là mình ko đệ qui , ko có tối ưu code, volo ,minh sai hả ???
code này của mình test :slight_smile: chỉ tính tông thôi bằng hai hàm đệ qui và for

#include <stdio.h>
#include <time.h>
#include <stdlib.h>



float cal( float *p , long int    n)
{
    int i;
    float sum=0 ;
    for(i =0 ; i< n; i++)
        sum+=p[i];

    return sum ;
}


    float  TongMang(float  *a, long int  n)
    {
       if (n < 0) return 0;
       return a[n] + TongMang(a, n-1);
    }

void main ()
{   int sum=0;
    int i;
    long int  n;
    float A[10000];
    clock_t  t_start,t_end;
    n=10000;
    for(i=0;i<n;i++)
        A[i]=rand()%100;
    t_start=clock();
    printf("\n value for %0.1f ",cal(A,n));
    t_end=clock();
    printf("\n  value time for %f ", (float)(t_end-t_start)/CLOCKS_PER_SEC);//tính thời gian thực thi của for 
    t_start=clock();
    printf("\n value  for  %0.1f ",TongMang( A, n));
    t_end=clock();
    printf(" \n value time  dequi %f ",(float) (t_end-t_start)/CLOCKS_PER_SEC);// tính thời gian thực thi của đễ qui
}

tính thời gian thì như nhau , nhưng mình thấy đọc cuốn ASM ghi rõ là mỗi lần gọi đệ qui <=> push biến local , address hàm, rồi lại phải trừ esp,càng dài thì stack càng bị chồng lên,->khi gọi đến biến toàn cục càng xa, phải tình thêm chi phi thông qua các biến ebp theo mô hình gì minh quên rồi …vân vân , nhưng rõ chậm hơn chứ hay hàm kiểm thời gian của mình sai , ai giải thích giùm với ,
, làm mình có 7 điểm à :joy:làm mình cứ tưởng ông thầy chơi ẩn ý vì thấy đề dễ quá ,huhu

1 Like

A post was merged into an existing topic: Topic chứa các reply được cho là off-topic - version 2

5 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?