Hỏi đáp

Chia sẻ kiến thức, cùng nhau phát triển

Giúp tớ bài thuật toán với ạ

09:23 20-04-2023 437 lượt xem 2 bình luận

.Cho a[ ] các số nguyên dương. Mô tả thuật toán tính tổng các sôa trong a[ ] thoả: >= 5 và <= 20

 

a). Không đệ quy

 

b). Đệ quy 

 

2. Cho b[m] các số nguyên. Mô tả thuật toán cho biết b[ ] có tính chất:" toàn là số < 0 " hay không. Thuật toán trả lại 1 nếu b[ ] có tính chất

 

a). Không đệ quy

 

b). Đệ quy

 

3. Cho c[n] các số nguyên và các số nguyên x. Mô tả thuật toán Chia để trị tính số lần xuất hiện x trong c[n].

Bình luận

Để bình luận, bạn cần đăng nhập bằng tài khoản Howkteam.

Đăng nhập
K9 SuperAdmin, KquizAdmin, KquizAuthor đã bình luận 11:17 26-04-2023

a) Thuật toán không đệ quy để tính tổng các số trong mảng a[ ] thoả: >= 5 và <= 20 như sau:

  • Khởi tạo biến sum = 0
  • Duyệt qua từng phần tử trong mảng a[ ]
  • Nếu phần tử hiện tại lớn hơn hoặc bằng 5 và nhỏ hơn hoặc bằng 20, thì cộng giá trị của phần tử đó vào biến sum
  • Trả về giá trị của biến sum là tổng các số thoả điều kiện

Đoạn mã C#:

int[] a = {3, 7, 10, 12, 18, 22};
int sum = 0;

for (int i = 0; i < a.Length; i++)
{
    if (a[i] >= 5 && a[i] <= 20)
    {
        sum += a[i];
    }
}

Console.WriteLine("Tổng các số trong mảng a thoả điều kiện là: " + sum);

1b) Thuật toán đệ quy để tính tổng các số trong mảng a[ ] thoả: >= 5 và <= 20 như sau:

  • Nếu mảng a[ ] rỗng, trả về giá trị 0
  • Nếu phần tử đầu tiên trong mảng a[ ] không thoả điều kiện, loại bỏ phần tử đó và gọi đệ quy với mảng đã bỏ phần tử đầu tiên
  • Nếu phần tử đầu tiên trong mảng a[ ] thoả điều kiện, thì cộng giá trị của phần tử đó vào kết quả của đệ quy với mảng đã bỏ phần tử đầu tiên
  • Trả về giá trị của kết quả đệ quy là tổng các số thoả điều kiện

Đoạn mã C#:

static int SumInRange(int[] a, int start, int end)
{
    if (start > end)
    {
        return 0;
    }
    if (a[start] < 5 || a[start] > 20)
    {
        return SumInRange(a, start + 1, end);
    }
    return a[start] + SumInRange(a, start + 1, end);
}

int[] a = {3, 7, 10, 12, 18, 22};
int sum = SumInRange(a, 0, a.Length - 1);

Console.WriteLine("Tổng các số trong mảng a thoả điều kiện là: " + sum);

2.
 

Để kiểm tra mảng b[] có tính chất "toàn là số < 0" hay không, ta có thể sử dụng thuật toán không đệ quy như sau:

  1. Khởi tạo biến k = 0
  2. Lặp từ i = 0 đến i < b.Length a. Nếu b[i] < 0, tăng giá trị k lên 1
  3. Kiểm tra nếu k == b.Length, trả về true (tất cả các số trong mảng b[] đều < 0), ngược lại trả về false.

Code minh họa:

bool CheckAllNegative(int[] b)
{
    int k = 0;
    for (int i = 0; i < b.Length; i++)
    {
        if (b[i] < 0)
            k++;
    }
    return k == b.Length;
}

 

Giải thích:

  • Bước 1: Khởi tạo biến k = 0 để đếm số phần tử của mảng b[] có giá trị < 0.
  • Bước 2: Lặp qua từng phần tử của mảng b[] và kiểm tra nếu giá trị < 0 thì tăng giá trị k lên 1.
  • Bước 3: Kiểm tra nếu giá trị của k bằng với độ dài của mảng b[] thì trả về true (tức là tất cả các phần tử đều < 0), ngược lại trả về false.

 

phucprotein đã bình luận 21:09 20-04-2023

1.a. Khai báo biến tổng (sum) với giá trị 0, sử dụng vòng lặp for duyệt mảng, nếu phần tử nào thoả điều kiện thì cộng vào biến tổng, kết thúc vòng lặp trả về biến tổng.

1.b.

// Tạo hàm lấy giá trị phù hợp với điều kiện
int GetValueWithCondition(int number)
{
    if (number >= 5 && number <= 20)
        return number;
    return 0;
}

// Tạo hàm tính tổng từ vị trí from đến cuối mảng
int Sum(int[] array, int from = 0)
/* "from = 0" tức là đặt giá trị mặc định là 0.
 * Khi gọi hàm có default ta không cần thêm parameter này cho hàm
 * Sum(array) sẽ tương đương với Sum(array, 0) và là kết quả của bài toán */

// Tổng từ vị trí from đến cuối mảng có n phần tử (array[from..n])
// array[from..n] = GetValueWithCondition(array[x]) + array[from+1..n]
sum = GetValueWithCondition(array[x]) + Sum(array, from + 1)
/* Sum(array, from + 1) sẽ tiếp tục tính Sum(array, from + 2), Sum(array, from + 3), ...
 * Sum(array, array.Length) */

// Điều kiện dừng xảy ra khi from = array.Length
// array[from..n] = 0
sum = 0

 

Câu hỏi mới nhất