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

Đề tài: [ hỏi ][đệ quy]có và không có return ?

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

    Mặc định [ hỏi ][đệ quy]có và không có return ?

    Các bạn xem giúp mình code thêm nút vào cây dưới đây :

    code :
    Code:
    int chennut(nut *&p,int x); 
    int chennut(nut *&p,int x)
    {
     if(p!=NULL)
     {
      if(p->d==x) return 0;
      if(p->d>x)  return chennut(p->pleft,x);   
      else return  chennut(p->pright,x);        
     }                                           
    					                       
     p=(nut*)malloc(sizeof(nut));                
     if(p==NULL) return -1;
     p->d=x;
     p->pleft=p->pright=NULL;
     return 1;
    }
    Đây là code trong sách nên chắc là không có gì sai đâu . Nếu giữ nguyên vậy và duyệt cây thì chạy bình thường . Nhưng mình thắc mắc khi mình bỏ 2 chữ return in đỏ trên thì thấy khi duyệt cây chỉ in được có phần tử cuối cùng mà ta nhập vào ?
    Theo mình hiểu thì khi ta giữ nguyên chữ return sẽ làm chương trình thoát khỏi hàm hiện hành trước rồi mới gọi tiếp hàm sau . Còn không thì nó sẽ giữ lại địa chỉ của hàm hiện hành rồi tí nữa sẽ quay lại và thoát ra sau . Đúng không ? Xin giải thích giùm mình . Cảm ơn .

  2. #2
    Ngày gia nhập
    10 2006
    Nơi ở
    In Your Bugs
    Bài viết
    823

    Ủa chèn nút mà sao in phần tử cuối cùng ta.

    Nếu muốn bỏ return thì cậu bỏ cái kiểu trả về là void. Sau đó sửa lại chút xíu là được. ok

  3. #3
    Ngày gia nhập
    12 2007
    Bài viết
    224

    À , bạn hiểu lầm ý mình rồi . Chèn nút xong thì mình duyệt cây ( in ra ) ấy mà . Theo kiểu LRN hay LNR gì ấy . Hàm duyệt cây của mình đây :
    Code:
    void duyetcay(nut *p);
    void duyetcay(nut *p)
    {
     if(p!=NULL)
     {
      printf("%d",p->d);   
      duyetcay(p->pleft);      
      duyetcay(p->pright);
     }
    }
    Đại khái là có in ra cấu trúc cây là được rồi . Nhưng nếu như hàm chèn nút sai thì cấu trúc cây sẽ bị sai dẫn đến in ra sai . Khi mình bỏ return trong hàm chèn nút thì thấy khi duyệt cây chỉ in ra mỗi một phần tử cuối cùng mình nhập vào , chứng tỏ cấu trúc cây có gì đó không ổn . Ở đây cái mà mình bỏ vào đối p trong hàm chèn nút chính là con trỏ nắm giữ nút gốc ( root ) .
    Đã được chỉnh sửa lần cuối bởi sieuphuong : 09-12-2007 lúc 04:48 PM.

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

    theo mình nghĩ nếu không return thì không được,
    vì mình cần một giá trị trả ra,nên phải return khi gọi đệ quy.ok

    Trên bầu trời tôi là ngôi sao lẽ
    Dưới trần gian tôi là kẻ cô đơn
    Trong xã hội tôi chẳng hơn ai hết
    Chốn đường tình tôi đã chết vì yêu.
    Đã được chỉnh sửa lần cuối bởi changtrai050188 : 10-12-2007 lúc 09:05 AM. Lý do: không gỏ dấu

  5. #5
    Ngày gia nhập
    12 2007
    Bài viết
    224

    Không phải đâu , thực sự nếu không có return thì vẫn chạy bình thường mà . Theo mình nghĩ thì nếu có return + lời gọi hàm thì trước hết chương trình phải thoát hẳn ra khỏi lời gọi hàm hiện hành rồi mới thực hiện lời gọi hàm kế tiếp ...???

  6. #6
    Ngày gia nhập
    10 2007
    Bài viết
    9

    Smile [ hỏi ][đệ quy]có và không có return ?

    Thực ra là khi bạn bỏ return, chương trình sẽ sai. Giả sử ta khi bắt đầu gọi hàm ta đã có một cây, lần gọi đầu sẽ vào trong câu IF và sẽ gọi một trong 2 nhánh trái hay phải, và nó sẽ lần lượt gọi tiếp cho đến nhánh lá cuối cùng phù hợp. Khi nhánh này NULL (vị trí lá thích hợp), lá sẽ đc cấp phát thành nhánh theo đoạn code dưới, và lần lượt return trở về lời gọi hàm từ gốc. Khi này, do ko có return, đoạn code dưới (trường hợp nút NULL) sẽ tiếp tục chạy, và nhánh hiện tại khi quay trở về sẽ bị cấp phát lại, 2 nhánh con của nó cũng bị set NULL .... Khi tới gốc cũng bị làm tương tự, câu lệnh p->d = x sẽ làm cho gốc có giá trị bằng với giá trị muốn chèn, và bạn sẽ chỉ thấy có phần tử này vì nhánh của nó đã bị set NULL. Để ko cần return, bạn phải bao trường hợp nhánh bằng NULL vào block else, như thế nó sẽ không đc thực thi khi đã vào nhánh IF. Code hoàn chỉnh :

    Code:
    int chennut(nut *&p,int x)
    {
    	if ( p != NULL )
    	{
    		if ( p->d == x ) return 0;
    		if ( p->d > x )
    			chennut(p->pleft, x);
    		else
    			chennut(p->pright, x);
    	}
    	else
    	{
    		p = (nut*)malloc( sizeof(nut) );
    		if ( p == NULL ) return -1;
    		p->d = x;
    		p->pleft = p->pright = NULL;
    	}
    	return 1;
    }

  7. #7
    Ngày gia nhập
    10 2006
    Nơi ở
    In Your Bugs
    Bài viết
    823

    Nếu bỏ return thì vẫn làm được. Có điều thêm vài điều kiện để quản lí thôi. Chứ ko phải là ko được. Nói chung là ko đáng.

    Với đoạn code của vukex thì có return với ko có return cũng đâu khác gì nhau ?

  8. #8
    Ngày gia nhập
    12 2007
    Bài viết
    224

    Bạn Vukex nói cũng giống giống như suy nghĩ của mình . Mình nghĩ khi ta bỏ return thì hàm đó sẽ làm như bạn nói vậy : "Khi này, do ko có return, đoạn code dưới (trường hợp nút NULL) sẽ tiếp tục chạy, và nhánh hiện tại khi quay trở về sẽ bị cấp phát lại, 2 nhánh con của nó cũng bị set NULL .... Khi tới gốc cũng bị làm tương tự, câu lệnh p->d = x sẽ làm cho gốc có giá trị bằng với giá trị muốn chèn, và bạn sẽ chỉ thấy có phần tử này vì nhánh của nó đã bị set NULL "

    Cái code bên dưới bạn viết mình cũng có đọc trong sách và cũng hiểu rồi . Nếu thêm else vào thì quá tốt thôi ...

    Mình xin trích lại lời dẫn của bạn để muốn nêu cái mục đích hỏi của mình nhé :
    Khi này, do ko có return, đoạn code dưới (trường hợp nút NULL) sẽ tiếp tục chạy
    Nếu nói vậy thì nếu có return tức là đoạn code dưới sẽ không chạy nữa phải không ? Mình chỉ thắc mắc ở chỗ này thôi

  9. #9
    Ngày gia nhập
    10 2007
    Bài viết
    9

    Nếu hàm đã đến câu return thì sẽ lấy hoặc tính (gọi hàm khác) giá trị trả về (trừ hàm void), sau đó sẽ thoát hàm để trả về cho lời gọi hàm, không thực thi thêm nữa.
    Đã được chỉnh sửa lần cuối bởi vukex2079 : 18-12-2007 lúc 01:35 PM.

  10. #10
    Ngày gia nhập
    12 2007
    Bài viết
    224

    OK cám ơn bạn nhiều . Bây giờ thì mình đã hiểu . Việc này theo mình nghĩ là rất quan trọng khi viết hàm con bởi vì có hay không có return sẽ làm bản chất của hàm con sai mất .

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

  1. Lập trình C++ Return * this là gì?
    Gửi bởi luongvancong trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 4
    Bài viết cuối: 29-09-2011, 03:45 PM
  2. hàm bắt buộc nhập số, nếu là số thì return 1, còn ký tự thì return 0;
    Gửi bởi khacphuctran 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: 11-03-2011, 04:39 PM
  3. Khi nào cần return 0, return 1 trong int main()
    Gửi bởi jojocolumbus trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 4
    Bài viết cuối: 22-06-2010, 10:23 AM
  4. Điểm khác biệt giữa get và return
    Gửi bởi EnnerIT trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 10
    Bài viết cuối: 17-04-2009, 08:18 PM
  5. cách sử dụng lệnh return?????
    Gửi bởi kiensctn trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 20
    Bài viết cuối: 23-03-2009, 11:06 PM

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