Đệ quy tìm phần tử trong mảng

Các bạn giúp em câu này với ạ, em đọc mà không hiểu phải nên làm gì

Chắc bài này là xây dựng phương thức generic
Em đang học C# đúng ko vậy ???

1 Like

Em đang học kỹ thuật lập trình c/c++, em đang ôn để thi cuối kỳ đó anh

1 Like

Vậy bài này liên quan đến con trỏ rồi :slight_smile:

1 Like

Chắc là dùng functor với cả templates thôi,

1 Like

This post was flagged by the community and is temporarily hidden.

1 Like

cái này có liên quan gì tới đệ quy đâu?

C++ có cái std::max_element hay std::min_element đó. Coi người ta khai báo thế nào. Vì là template nên code đầy đủ cũng dễ thấy luôn mà.

C thì ko có template, xài đỡ void* với con trỏ hàm là được.

2 Likes

Bài này là đề thi mấy năm trước, mình đang ôn chứ trường không cho đăng đề như vậy đâu bạn

1 Like

Mà bạn hiểu đề kêu nói là gì không bạn? Mình đọc mà không hiểu đề yêu cầu mình phải làm gì đó bạn

1 Like

Mình còn học C với C++ thôi bạn, bạn nói mình hơi khó hiểu quá

1 Like

Bạn nói cách làm thôi được không bạn, mình chỉ không hiểu là đề kêu làm gì thôi bạn

1 Like

Bài kiểu này mà làm C/C++ thì chắc dùng con trỏ, hoặc template bên C++
Dạng bài này là 1 hàm có 2 tham số : 1 tham số dại diện cho 1 hàm nào đó dùng để xác định chuẩn, 1 tham số tiếp theo là kiểu dữ liệu đầu vào

1 Like

đại khái là viết 1 cái hàm kiểu như vậy nè: http://en.cppreference.com/w/cpp/algorithm/max_element

có thể viết thành như sau:

template <class ForwardIter, class BinaryComp>
ForwardIter bestElement(ForwardIter first, ForwardIter last, BinaryComp comp)
{
    if (first == last) return last;
    ForwardIter best = first;
    while (++first != last)
        if (comp(*first, *best) > 0)
            best = first;
    return best;
}

trong cái template trên ta định nghĩa:

  • ForwardIter là 1 kiểu cho phép xài ++x (forward nghĩa là tiến tới) và *x (iter nghĩa là có thể dereference như con trỏ được).
  • BinaryComp là 1 kiểu cho phép xài x(a,b) tức là nó như 1 hàm nhận 2 giá trị (binary function nghĩa là hàm có 2 biến), và giá trị trả về là số nguyên để so sánh với 0. Nếu giá trị trả về của x(a,b) < 0 tức là a < b, == 0 nghĩa là a == b, > 0 nghĩa là a > b.

xài:

int maxAbs(int a, int b) { return abs(a) - abs(b); }
int max(int a, int b) { return a - b; }

int main()
{
    int a1[] = {2,8,-5,6,-9,4,2,1};
    std::vector<int> a2(a1, a1+sizeof(a1)/sizeof(*a1));

    int best1 = *bestElement(a1, a1+sizeof(a1)/sizeof(*a1), maxAbs); //best1 = -9
    int best2 = *bestElement(a2.begin(),  a2.end(), max); //best2 = 8
}
3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?