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ố 20 kết quả

Đề tài: Giúp em bài tập về hàm!

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

    Mặc định Giúp em bài tập về hàm!

    Giả sử số đầu tiên của 1 chuỗi là x, với x là 1 số nguyên. Khi đó các phần tử của chuỗi được xác định như sau a(0)=x; a(n+1) = a(n)/2 nếu a(n) chẵn; a(n+1) = 3*a(n) +1 nịếu a(n) lẻ. Tồn tại 1 số nguyên k sao cho a(k)=1. Hãy viết chương trình cho phép người dùng nhập giá trị x, chương trình sẽ xuất ra số nguyên k sao cho a(k)=1 và a(0),a(1),a(2),...,a(k).
    bài này nghĩ mãi mà không ra, ai giúp em với.

  2. #2
    Ngày gia nhập
    04 2010
    Bài viết
    1,534

    Không có thì giờ tính xem hàm có luôn luôn quy về 1 hay không.

    Code này giả sử hàm luôn luôn quy về 1 khi n tiến tới một trị nào đó.

    C Code:
    1. int a = x;
    2. int k = 0;
    3. for (k=0; ; k++)
    4. {
    5.   printf("a(%d) = ", k, a); // in trị số a(n)
    6.   if (a <= 1) break; // đã đạt a(k) = 1
    7.   a = (a & 1)? 3*a+1 : a/2;
    8. }
    9. // nếu a == 1, k là trị cần tìm; nếu a == 0, không có trị k

  3. #3
    Ngày gia nhập
    01 2012
    Nơi ở
    localhost
    Bài viết
    140

    Bài này luôn có đáp án mà. Ai chứng minh đi. Mình hông biết
    Nhìn cái đề sặc mùi đệ quy. Với tiêu đề là bài tập về hàm vậy chắc là viết một hàm đệ quy.
    C++ Code:
    1. #include <iostream>
    2. #include <conio.h>
    3. using namespace std;
    4.  
    5. int f(int k, int x)
    6. {
    7.     if (k == 0)
    8.         return x;
    9.     int f_minus_1 = f(k-1, x);
    10.     if (f_minus_1 % 2 == 0)
    11.         return f_minus_1 / 2;
    12.     return 3 * f_minus_1 + 1;
    13. }
    14.  
    15. int main()
    16. {
    17.     cout << "Nhap x = ";
    18.     int x;
    19.     cin >> x;
    20.     int k = 0;
    21.     while (f(k, x) != 1)
    22.     {
    23.         k++;
    24.     }
    25.     cout << "k = " << k << endl;
    26.     while (k >= 0)
    27.     {
    28.         cout << "A[" << k << "] = " << f(k, x) << endl;
    29.         k--;
    30.     }
    31.     getch();
    32.     return 0;
    33. }

    Nhưng mà không nên làm đệ quy. Nên dùng 1 biến lưu lại giá trị của phần tử liền kề nó và tính tới khi nào ra kết quả là 1 thì dừng. Như VoTichSu đã làm ở trên.
    C++ Code:
    1. #include <iostream>
    2. #include <conio.h>
    3. using namespace std;
    4.  
    5. int main()
    6. {
    7.     cout << "Nhap x = ";
    8.     int x;
    9.     cin >> x;
    10.     int a = x;
    11.     int k = 0;
    12.     for (k = 0; a != 1; k++)
    13.     {
    14.         printf("a(%d) = %d\n", k, a);
    15.         a = (a & 1)? 3 * a + 1 : a / 2;
    16.     }
    17.     printf("a(%d) = %d\n", k, a);
    18.     getch();
    19.     return 0;
    20. }
    Rẹt rẹt..

  4. #4
    Ngày gia nhập
    04 2010
    Bài viết
    1,534

    Hình như là sau một hồi nhân 3 và cộng 1 (số lẻ thành số chẵn), rồi lại chia 2 (số chẵn thành chẵn hoặc lẻ) thì số sẽ trở thành lũy thừa của 2, và cuối cùng thì quy về 1.

    Nhìn công thức đoán mò vậy thôi chứ không có thì giờ thử.

  5. #5
    Ngày gia nhập
    11 2010
    Bài viết
    589

    Vừa mới học khi chiều. Đây gọi là giả thuyết 3x+1, chưa ai chứng minh được là đúng hay sai.

  6. #6
    Ngày gia nhập
    07 2010
    Nơi ở
    chỗ kín
    Bài viết
    446

    Mặc định Giúp em bài tập về hàm!

    thay 3x+1 thành 4x+1 hay 6x+1; 9x+1 đều bị phân kỳ hết, vẽ đồ thị ra không tìm được quy luật nào cả.

  7. #7
    Ngày gia nhập
    04 2010
    Bài viết
    1,534

    Trích dẫn Nguyên bản được gửi bởi pkthanh92 Xem bài viết
    thay 3x+1 thành 4x+1 hay 6x+1; 9x+1 đều bị phân kỳ hết, vẽ đồ thị ra không tìm được quy luật nào cả.
    Thuật tổng quát hóa sai.
    Nếu n là số lẻ thì 3n+1 là số chẵn.
    4n+1, 6n+1 luôn luôn là số lẻ.

    Hàm này không phải là hàm liên tục (phép áp chẵn lẻ khác nhau) làm sao mà vẽ đồ thị?

    Chạy thử sẽ thấy quanh quẩn một hồi cũng trở về một trị là lũy thừa của 2, và từ đó tiếp tục đi đến 1

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

    Vậy bây h vấn đề là làm sao chứng miinh cái đống trên hội tụ về 1 số lũy thừa của 2. @@
    ___
    Nhận thấy 1 điều. Nếu x=2 thì 2/2 =1 -> Đúng. (khỏi bàn )
    Trường hợp còn lại:
    Với Mọi số chẵn c , thì luôn tồn tại 1 số lẻ l sao cho 3*l + 1 = 2^c . Gọi tập hợp các số lẻ l này là tập L
    Trong khi đó nếu c lẻ thì không bao giờ chuyện đó xảy ra.
    Vậy cái hàm trên có hội tụ thì cũng chỉ hội tụ về lũy thừa bậc chẵn của 2 mà thôi.

    Vậy vấn đề là liệu với mọi số lẻ x, thì có luôn luôn đưa được về một phần tử thuộc tập L trên hay không
    @@ Bắt đầu đau não rồi mọi người ạ
    Um Mani Padme Hum...!!

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

    Trích dẫn Nguyên bản được gửi bởi sim Xem bài viết
    Bài này luôn có đáp án mà. Ai chứng minh đi. Mình hông biết
    Nhìn cái đề sặc mùi đệ quy. Với tiêu đề là bài tập về hàm vậy chắc là viết một hàm đệ quy.
    C++ Code:
    1. #include <iostream>
    2. #include <conio.h>
    3. using namespace std;
    4.  
    5. int f(int k, int x)
    6. {
    7.     if (k == 0)
    8.         return x;
    9.     int f_minus_1 = f(k-1, x);
    10.     if (f_minus_1 % 2 == 0)
    11.         return f_minus_1 / 2;
    12.     return 3 * f_minus_1 + 1;
    13. }
    14.  
    15. int main()
    16. {
    17.     cout << "Nhap x = ";
    18.     int x;
    19.     cin >> x;
    20.     int k = 0;
    21.     while (f(k, x) != 1)
    22.     {
    23.         k++;
    24.     }
    25.     cout << "k = " << k << endl;
    26.     while (k >= 0)
    27.     {
    28.         cout << "A[" << k << "] = " << f(k, x) << endl;
    29.         k--;
    30.     }
    31.     getch();
    32.     return 0;
    33. }

    Nhưng mà không nên làm đệ quy. Nên dùng 1 biến lưu lại giá trị của phần tử liền kề nó và tính tới khi nào ra kết quả là 1 thì dừng. Như VoTichSu đã làm ở trên.
    C++ Code:
    1. #include <iostream>
    2. #include <conio.h>
    3. using namespace std;
    4.  
    5. int main()
    6. {
    7.     cout << "Nhap x = ";
    8.     int x;
    9.     cin >> x;
    10.     int a = x;
    11.     int k = 0;
    12.     for (k = 0; a != 1; k++)
    13.     {
    14.         printf("a(%d) = %d\n", k, a);
    15.         a = (a & 1)? 3 * a + 1 : a / 2;
    16.     }
    17.     printf("a(%d) = %d\n", k, a);
    18.     getch();
    19.     return 0;
    20. }
    Cảm ơn anh, bài làm thật hoàn chỉnh, nhưng mà em muốn có nó xuất ra riêng lẻ 1 số k cao nhất thì phải thêm gì bây giờ anh.
    À cho em hỏi anh có thể giải thích cho em mấy cái dấu trong đoạn này không.
    a = (a & 1)? 3*a+1 : a/2;
    Đã được chỉnh sửa lần cuối bởi kingwarcraft : 12-02-2012 lúc 04:16 PM.

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

    (a&1)? là tương đương (a%2!=0) ?
    Um Mani Padme Hum...!!

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

  1. Sự cố Nhờ mod chuyển giúp bài "Sắp xếp số thứ tự ngay trong bảng của 1 database?" từ MySQL sang MSSQL giúp!
    Gửi bởi hu-xeko trong diễn đàn Ý kiến, đề xuất và khiếu nại
    Trả lời: 1
    Bài viết cuối: 12-03-2012, 07:48 PM
  2. Mới nhập môn khó quá , cần trợ giúp [Vấn đề của bạn cần muốn giúp là gì ?]
    Gửi bởi cuingo212 trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 5
    Bài viết cuối: 22-10-2011, 08:43 AM
  3. Chương trình giúp một học sinh cấp 1 học phép nhân, xử lý hàm rand, giúp mình với?
    Gửi bởi chankx trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 2
    Bài viết cuối: 12-05-2009, 08:52 PM
  4. Code giúp add một key vào registry, ai giúp em?
    Gửi bởi olavien trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 5
    Bài viết cuối: 12-12-2007, 08:45 AM

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