Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 16 kết quả

Đề tài: Thuật toán quay lui, liệt kê các dãy nhị phân độ dài n. Kết quả không đúng?

  1. #1
    Ngày gia nhập
    05 2008
    Nơi ở
    HàNội™
    Bài viết
    4

    Question Thuật toán quay lui, liệt kê các dãy nhị phân độ dài n. Kết quả không đúng?

    Liệt kê các dãy nhị phân độ dài n bằng thuật toán quay lui, mình đã code nhưng ko ra đúng kết quả ,các bạn check dùm mình thx
    C Code:
    1. #include<conio.h>
    2. #include<stdio.h>
    3. void quaylui(int i,int n)
    4. {
    5.     int j,k;
    6.         int a[30];
    7.     for(j=0;j<=1;j++)
    8.     {
    9.         a[i]=j;
    10.         if(i==n-1)
    11.                         {
    12.             for(k=0;k<n;k++)
    13.                 printf("%d",a[k]);
    14.             printf("\n");
    15.                         }
    16.         else quaylui(i+1,n);
    17.     }
    18. }
    19. void main()
    20. {       int n;
    21.     printf("nhap n=");
    22.         scanf("%d",&n);
    23.     quaylui(0,n);
    24. getch();
    25. }

  2. #2
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất nhiều sóng gió
    Bài viết
    469

    Bạn đổi khai báo int a[30] thành static int a[30] thì sẽ được.

    Ví dụ:
    Code:
    nhap n=3
    000
    001
    010
    011
    100
    101
    110
    111

  3. #3
    Ngày gia nhập
    03 2008
    Nơi ở
    Đà Nẵng city
    Bài viết
    40

    Bro Ada ơi, giải thik dùm mình đi.Mình cũng đang định hỏi cái này, vào đây thì thấy có ng hỏi ròy, thân

  4. #4
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất nhiều sóng gió
    Bài viết
    469

    Trích dẫn Nguyên bản được gửi bởi camping29 Xem bài viết
    Bro Ada ơi, giải thik dùm mình đi.Mình cũng đang định hỏi cái này, vào đây thì thấy có ng hỏi ròy, thân
    Đơn giản thôi mà: trong hàm quaylui(), toàn bộ mảng a[] được sử dụng, nhưng trước khi sử dụng chỉ có mỗi lệnh gán cho 1 phần tử của mảng a[] mà không có lệnh nào gán cho toàn bộ a[]. Như thế hiển nhiên a[] không thể là biến auto trong hàm mà phải thuộc về ngữ cảnh của hàm, tức là một biến mà đã xác định ít ra là một phần ngay từ trước khi gọi hàm rồi.

    Những biến thuộc ngữ cảnh của hàm gồm có:

    - biến toàn cục, tức biến khai báo ngoài mọi hàm, tồn tại trong suốt thời gian chạy chương trình, nhìn thấy và dùng được ở mọi hàm;

    - biến static, tức biến khai báo trong hàm, chỉ nhìn thấy và dùng được trong hàm, nhưng có thời gian tồn tại như biến toàn cục;

    - tham số vào của hàm, ví dụ, ta có thể khai báo quaylui(int a[], int i, int n), khai báo int a[30] trong hàm main() và truyền a vào quaylui(). Khi đó a[] tồn tại, nhìn thấy và dùng được trong suốt thời gian ở trong hàm main() và do đó, tồn tại, nhìn thấy và dùng được (thông qua tham số truyền) trong suốt thời gian ở trong lời gọi quaylui(a,...) từ hàm main() và mọi lời gọi quaylui(a,...) đệ quy từ đó.

    Trong 3 cách chữa trên, mình xui bạn ấy dùng static vì nó là cách lười nhất để chữa văn bản nguồn trở thành chạy được :-P , cách tệ nhất là biến toàn cục, và cách tốt nhất là tham số.
    Đã được chỉnh sửa lần cuối bởi Ada : 01-06-2008 lúc 01:25 AM.

  5. #5
    Ngày gia nhập
    07 2011
    Bài viết
    1

    Trích dẫn Nguyên bản được gửi bởi Ada Xem bài viết
    Đơn giản thôi mà: trong hàm quaylui(), toàn bộ mảng a[] được sử dụng, nhưng trước khi sử dụng chỉ có mỗi lệnh gán cho 1 phần tử của mảng a[] mà không có lệnh nào gán cho toàn bộ a[]. Như thế hiển nhiên a[] không thể là biến auto trong hàm mà phải thuộc về ngữ cảnh của hàm, tức là một biến mà đã xác định ít ra là một phần ngay từ trước khi gọi hàm rồi.

    Những biến thuộc ngữ cảnh của hàm gồm có:

    - biến toàn cục, tức biến khai báo ngoài mọi hàm, tồn tại trong suốt thời gian chạy chương trình, nhìn thấy và dùng được ở mọi hàm;

    - biến static, tức biến khai báo trong hàm, chỉ nhìn thấy và dùng được trong hàm, nhưng có thời gian tồn tại như biến toàn cục;

    - tham số vào của hàm, ví dụ, ta có thể khai báo quaylui(int a[], int i, int n), khai báo int a[30] trong hàm main() và truyền a vào quaylui(). Khi đó a[] tồn tại, nhìn thấy và dùng được trong suốt thời gian ở trong hàm main() và do đó, tồn tại, nhìn thấy và dùng được (thông qua tham số truyền) trong suốt thời gian ở trong lời gọi quaylui(a,...) từ hàm main() và mọi lời gọi quaylui(a,...) đệ quy từ đó.

    Trong 3 cách chữa trên, mình xui bạn ấy dùng static vì nó là cách lười nhất để chữa văn bản nguồn trở thành chạy được :-P , cách tệ nhất là biến toàn cục, và cách tốt nhất là tham số.
    Cám ơn bạn, đúng là thứ mình đang tìm kiếm ^^!

  6. #6
    Ngày gia nhập
    08 2011
    Bài viết
    2

    Mặc định thuật toán quay lui và thuật toán sinh

    các bạn code hộ mình :
    cài đặt thuật toán quay lui và thuật toán sinh cho bai toán liệt kê hoán vị với dử liệu vào ra trên tệp
    cụ thể :liệt kê hoán vị n số với hai thuật toán trên ,kết qua lưu ra file

  7. #7
    Ngày gia nhập
    03 2012
    Nơi ở
    TP. HCM
    Bài viết
    5

    Code:
    #include <iostream>
    using namespace std;
    void Display(int a[], int n){
    	for(int i=0;i<=n;i++)
    		cout<<a[i]<<" ";
    	cout<<endl;
    }
    void hoanVi(int a[],int b[], int i,int n){
    	for(int j=0; j<=n; j++){
    		if(b[j]==0){
    			a[i]=j; b[j]=1;
    			if(i==n)	Display(a,n);
    			else		hoanVi(a,b,i+1,n);
    			b[j]=0;
    		}
    	}
    }
    void main(){
    	int b[10]={0};
    	int a[10]={0};
    	hoanVi(a,b,0,5);	
    }
    hì, mình chỉ biết code thuật toán quay lui để tìm hoán vị n số thôi ^^!
    ví dụ trên là hoán vị từ 0 tới 5 :P
    ...Nguyễn Xuân Giềng...

  8. #8
    Ngày gia nhập
    11 2010
    Nơi ở
    Black Hole
    Bài viết
    824

    Code:
    nhap n=3
    000
    001
    010
    011
    100
    101
    110
    111
    Bài như thế này thì có 1 cách rất vui.
    Nếu bạn để ý thì nếu ta đi từ phải sang trái trong dãy 000, nếu gặp số 1 thì đi tiếp, nếu gặp số 0 thì gán cho nó giá trị 1 và gán tất cả giá trị bên phải về 0.

    Mỗi lần gán giá trị bạn sẽ in ra dc dãy số cần tìm.
    Come as guest...... stay as family......... because we're smiling together.

  9. #9
    Ngày gia nhập
    03 2011
    Bài viết
    12

    Trích dẫn Nguyên bản được gửi bởi clamvn Xem bài viết
    Code:
    nhap n=3
    000
    001
    010
    011
    100
    101
    110
    111
    Bài như thế này thì có 1 cách rất vui.
    Nếu bạn để ý thì nếu ta đi từ phải sang trái trong dãy 000, nếu gặp số 1 thì đi tiếp, nếu gặp số 0 thì gán cho nó giá trị 1 và gán tất cả giá trị bên phải về 0.

    Mỗi lần gán giá trị bạn sẽ in ra dc dãy số cần tìm.
    đó là dùng hàm sinh cậu ah

  10. #10
    Ngày gia nhập
    03 2011
    Bài viết
    4

    Mặc định in dãy nhị phân

    Trích dẫn Nguyên bản được gửi bởi Ada Xem bài viết
    Đơn giản thôi mà: trong hàm quaylui(), toàn bộ mảng a[] được sử dụng, nhưng trước khi sử dụng chỉ có mỗi lệnh gán cho 1 phần tử của mảng a[] mà không có lệnh nào gán cho toàn bộ a[]. Như thế hiển nhiên a[] không thể là biến auto trong hàm mà phải thuộc về ngữ cảnh của hàm, tức là một biến mà đã xác định ít ra là một phần ngay từ trước khi gọi hàm rồi.

    Những biến thuộc ngữ cảnh của hàm gồm có:

    - biến toàn cục, tức biến khai báo ngoài mọi hàm, tồn tại trong suốt thời gian chạy chương trình, nhìn thấy và dùng được ở mọi hàm;

    - biến static, tức biến khai báo trong hàm, chỉ nhìn thấy và dùng được trong hàm, nhưng có thời gian tồn tại như biến toàn cục;

    - tham số vào của hàm, ví dụ, ta có thể khai báo quaylui(int a[], int i, int n), khai báo int a[30] trong hàm main() và truyền a vào quaylui(). Khi đó a[] tồn tại, nhìn thấy và dùng được trong suốt thời gian ở trong hàm main() và do đó, tồn tại, nhìn thấy và dùng được (thông qua tham số truyền) trong suốt thời gian ở trong lời gọi quaylui(a,...) từ hàm main() và mọi lời gọi quaylui(a,...) đệ quy từ đó.

    Trong 3 cách chữa trên, mình xui bạn ấy dùng static vì nó là cách lười nhất để chữa văn bản nguồn trở thành chạy được :-P , cách tệ nhất là biến toàn cục, và cách tốt nhất là tham số.
    #include<conio.h>
    #include<stdio.h>
    int i=0;//bien toan cuc
    void quaylui(int n)
    {
    int j,k;
    static int a[30];
    for(j=0;j<=1;j++)
    {
    a[i]=j;
    if(i==n-1)
    {
    for(k=0;k<n;k++)
    printf("%d",a[k]);
    printf("\n");
    }
    else
    {i++; quaylui(n);
    }
    }
    }
    void main()
    { int n;
    printf("nhap n=");
    scanf("%d",&n);
    quaylui(n);
    getch();
    }

    Mình viết như trên nhưng không đúng nhỉ, cậu xem dùm lỗi ở đâu vậy?

Các đề tài tương tự

  1. Thuật toán quay lui,đếm kết quả các dãy nhị phân độ dài n.Kết quả không đúng
    Gửi bởi fabiano90 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 29-11-2012, 10:44 AM
  2. Các thuật toán sắp xếp và tìm kiếm cho Quản lí thư viện chạy không đúng kết quả?
    Gửi bởi dangquan045 trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 3
    Bài viết cuối: 28-09-2012, 07:02 PM
  3. Máy Quay HD Sony, máy quay sony Handycam, máy quay kỹ thuật số, máy quay phim mới tinh Mo
    Gửi bởi dientuthaithang trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 472
    Bài viết cuối: 03-08-2012, 05:16 PM
  4. Thuật toán quay lui_ n quả cân
    Gửi bởi butbi_pro trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 6
    Bài viết cuối: 14-05-2010, 10:41 PM
  5. Thuật Toán quay lui cho 8 quân hậu đúng chưa? member nào bổ xung cho nó chạy luôn nhỉ?
    Gửi bởi bqonline trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 8
    Bài viết cuối: 17-07-2009, 01:05 PM

Tags của đề tài này

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn