01/10/2018, 12:17

Giá trị trả về của hàm khi ko có hàm return

int goc_la(node *root,int a,int dai)
{
	if(root==NULL)return 0;
	else
	{
		if(a<root->info&&node_la(root)==0)
		{
			dai++;
			goc_la(root->left,a,dai);
		}
		else if(root->info<a&&node_la(root)==0)
		{
			dai++;
			goc_la(root->right,a,dai);
		}
		else
		{
			return dai;
		}
	}
}
//đã có 1 mảng tạo từ các node lá theo cách duyệt LNR
int tong_dai(node *root,int a[],int n)
{
	int s=0;
	for(int i=0;i<n;i++)
	{
		int dai=goc_la(root,a[i],0);//chạy từ gốc nên chiều dài từ gốc sẽ là 0
		s=s+dai;
	}
	return s/n;
}

đây là cách chạy tay của mình từ gốc đến node lá thứ 1
-8(gốc) - 65 -32 -49 -53(lá) độ dài của lá thứ 1 là 4
hàm đệ quy -8 -> if thoát hàm nhưng ko có trả về
hàm đệ quy -65 -> else if thoát hàm nhưng ko có trả về
hàm đệ quy -32 -> if thoát hàm nhưng ko có trả về
hàm đệ quy -49 -> if thoát hàm nhưng ko có trả về
hàm đệ quy -53 -> else thoát hàm -53 -> hàm -53 trả về là 4
mấy hàm trên nó ko có trả về thì làm sao mà máy nó biết dem=4 nó ra kết quả nhưng mình ko hiểu tại sao?

Vô Thin viết 14:22 ngày 01/10/2018

Một hàm đệ quy dường như trả về giá trị về khác với hàm thông thường. Nếu muốn thử xem trả về thì return tên_hàm_đó; đặt ở cuối hàm đó.

Nguyễn Phú Thành viết 14:22 ngày 01/10/2018

oke nói mới nhớ lá đệ quy có thể đặt return ở trước hàm trả về mà nếu ko có return thì nó chạy đến } thoát hàm nhưng vẫn ra kết quả đúng tại sao thế nhỉ ?

rogp10 viết 14:22 ngày 01/10/2018

Nhiều khi có tối ưu đệ quy đuôi nên hàm suy biến thành vòng lặp luôn. Bạn debug đặt bp xem thử call stack có gọi hàm không.

Nguyễn Phú Thành viết 14:18 ngày 01/10/2018

sau khi thoát -53 trả về 4


nó sẽ luôn trả về = 4 dù cho nó có thoát khỏi hàm đệ quy nào đi chăng nữa khi ko có return

*grab popcorn* viết 14:26 ngày 01/10/2018

:3 Vì bạn đang gặp may đấy.

Việc return 1 giá trị thường sẽ được đưa vào thanh ghi EAX (hoặc RAX nếu 64-bit). Và cái may của bạn là có lẽ compiler đã biên dịch ra code khi xử lý, chương trình lưu trữ giá trị của biến dai vào EAX để tính toán. Vậy nên khi không return, chương trình lấy giá trị từ EAX ra làm return value và in ra kết quả được lưu trữ trước đó.

https://stackoverflow.com/questions/4815819/c-return-value-without-return-statement

Nguyễn Phú Thành viết 14:17 ngày 01/10/2018

khi chưa vào hàm lệnh return ấy cái số trả về thay đổi liên tục
vậy nếu ko may thì nó sẽ trả về giá trị 3884576 à ?

*grab popcorn* viết 14:31 ngày 01/10/2018

Đó là điều không ai biết được bạn ơi.
Code trên của bạn bị dính tà độc “undefined behavior” (như link trích dẫn) nên việc nó return gì thì mình cũng ko biết được.

Nguyễn Phú Thành viết 14:20 ngày 01/10/2018

vẫn nên cho return trước mấy cái hàm nhỉ thực ra ko có gì đâu nếu ko có return thì việc debug mấy cái đệ quy này dễ hơn đệ quy nó cộng dồn or trả giá trị từ trong ra ngoài rất là dễ sai sót.hỏi để xem nó có hợp lệ hay ko nếu đc thì mình sẽ dùng cách này tiện cho việc code hay debug.

Bài liên quan
0