Thứ Năm, 5 tháng 4, 2012

Kỹ thuật sử dụng 1 vòng lặp làm việc thay cho 2 vòng lặp

(Code demo bằng C)
Bài toán: In ra màn hình tam giác dấu '*'
Ví dụ:
*
**
***
****
*****
******
...
Cách giải thường sử dụng:
  • Sử dụng 2 vòng lặp
  • Vòng lặp đầu tiên sẽ cho duyệt qua các dòng
  • Vòng lặp thứ 2 sẽ cho in ra các dấu '*' tương ứng trên mỗi dòng (dòng 1 in 1 dấu, dòng 2 in 2 dấu...)
Code:
#include <stdio.h>
#include <conio.h>
void main()
{
    int i, j, n=10;
    clrscr();
    for(i=1; i<=n; i++)
    {
        for(j=1; j<=i; j++)
            printf("*");
        printf("\n");
    }
    getch();
}
Cách giải sử dụng 1 vòng lặp
  • Sử dụng 1 vòng lặp + 2 biến
  • Biến đầu tiên dùng để duyệt các dòng
  • Biến thứ hai dùng để in ra các dấu '*' trên mỗi dòng
Code:
#include <stdio.h>
#include <conio.h>
void main()
{
    int i=1, j=1, n=10;
    clrscr();
    while (i<=n)
    {
         printf("*");
         j++;
         if(j==i+1)
         {
             j=1;
             i++;
             printf("\n");
         }
    }
    getch();
}
Như vậy, chúng ta đã sử dụng 1 vòng lặp thay cho 2 vòng lặp nhưng vẫn có thể giải quyết được bài toán đặt ra.
Ghi chú: Về mặc thực tế thì vòng lặp while cũng giống như vòng lặp for nên 2 cách giải này không phải khác nhau ở chỗ chúng ta sử 2 cấu trúc lệnh khác nhau. (Vì chúng ta có thể thay while(i<=n) bằng for(;i<=n;))
Ví dụ khác: Sắp xếp một mảng theo thứ tự tăng dần.
#include <stdio.h>
#include <conio.h>
void main()
{
    int arr[10]={1,6,8,4,7,8,3,9,2,5},i=0, j=1, tg, n=10;
    clrscr();
    while (i<n-1)
    {
        if(arr[i]>arr[j])
        {
            tg= arr[i];
            arr[i]= arr[j];
            arr[j]= tg;
        }
        j++;
        if(j==n)
        {
            i++;
            j=i+1;
        }
    }
    for (i=0 ;i<n ; i++)
    {
        printf("%d \t",arr[i]);
    }
    getch();
}
Tóm lại: Bài viết này giúp cho các bạn hiểu thêm về cách sử dụng vòng lặp và biết thêm 1 thủ thuật trong lập trình. Còn về mặt nguyên lý hoạt động thì 2 cách này có độ phức tạp như nhau nên cách sử dụng 1 vòng lặp thay cho 2 vòng này không làm cho chương trình chạy nhanh hơn thậm chí còn chậm hơn vì cứ mỗi lần lặp nó lại phải thêm 1 lần kiểm tra giữa 2 biến.

Không có nhận xét nào:

Đăng nhận xét