2013-11-28 24 views
5

Tôi đang cố gắng viết một hàm đệ quy, nhưng gặp lỗi trong dòng: n + sum (n-1); Trình biên dịch của tôi là tiếng Đức, vì vậy bản dịch kém của thông báo lỗi sẽ là: "giá trị void không bị bỏ qua như được cho là". Cảm ơn vì sự giúp đỡ!Hiểu lỗi trong hàm đệ quy?

void sum (int n) 
{ 
    if(n==0) 
    { 
     cout << n << endl; 
    } 
    else if(n>0) 
    { 
     n + sum(n-1); 
     cout << n << endl; 
    } 
} 

int main() 
{ 
    sum(3); 
    return 0; 
} 
+0

Bạn không thể trở về giá trị từ 'chức năng void' và không thể lấy lại giá trị từ chúng. –

+0

Đó là bởi vì dòng đó không làm gì cả. –

+0

Đó là một bản dịch khá hay, và nó chính xác. Bạn phải bỏ qua (không sử dụng) giá trị trả về của hàm trả về void. – rici

Trả lời

3

phương pháp tổng hợp của bạn trả về void, thay đổi nó để int

int sum (int n) 
1

Bạn cố gắng thêm n và sum (n-1), nhưng tổng không có giá trị trả về, vì vậy đây là một lỗi. Bạn nên sửa đổi tổng để trả về một int, và thêm các câu lệnh trả về trong hai nếu các phần tử.

1

Khi bạn viết "void sum" bạn đã nói với trình biên dịch rằng tổng sẽ không trả lại bất cứ điều gì. Cái này sai. Thử thay thế "void" bằng int.

5

Chú ý rằng bạn đã xác định các chức năng như

void sum (int n); 

Chức năng này không có giá trị trả về. Tuy nhiên, trong mã này:

n + sum(n-1); 

Bạn đang cố gắng thêm n với giá trị trở lại của sum(n - 1), mà không phải là quy phạm pháp luật vì sum(n - 1) không tạo ra một giá trị.

Để khắc phục điều này, có thể bạn sẽ muốn thay đổi chức năng sao cho nó trả về một int. Nếu bạn làm điều này, bạn sẽ cần thực hiện các thay đổi khác, chẳng hạn như thêm câu lệnh trả về vào hàm, nhưng nó sẽ giúp bạn đi đúng hướng.

Hy vọng điều này sẽ hữu ích!

2

Phương thức sum() của bạn sẽ trả về một giá trị, nó sẽ trả về tổng. Bạn nên xác định nó như thế này

int sum (int n) 
{ 
if(n==0) 
{ 
cout << n << endl; 
return 0; 
} 
else if(n>0) 
{ 
    cout << n << endl; 
    return n + sum(n-1); 
} 
} 
+0

Bạn phải nhấn mạnh rằng 'n + sum (n-1);' không có gì ngoại trừ việc tính thời gian tính toán. Tôi nghĩ rằng exemple của bạn là thực sự gây hiểu lầm. – Johan

+0

Cảm ơn, tôi đã chỉnh sửa câu trả lời để xóa dòng vô dụng – slecorne

0

Tôi hiểu rồi. Thật là ngu ngốc với tôi. Nó phải là tất nhiên n = n + tổng (n-1); Và một hàm int. Xin cảm ơn các bạn.

+1

Vui lòng không viết nhận xét làm câu trả lời.Hãy chắc chắn rằng bạn bỏ phiếu cho (các) câu trả lời đã giúp bạn và chấp nhận câu trả lời hữu ích nhất. – paddy

+0

OK. Xin lỗi, sẽ phải làm quen với điều này;) – Julius

+0

Không sao cả. Cách tốt nhất để xử lý trên trang web này là đọc: http://stackoverflow.com/about – paddy

0
  • Chức năng đệ quy cần trả lại thứ gì đó ở từng vị trí đuôi.
  • Chức năng đệ quy cần phải làm cho vấn đề nhỏ hơn ở mỗi lần đệ quy.

Dưới đây là một ví dụ về làm thế nào để làm điều đó:

int sum (int n) 
{ 
    return n == 1 ? 1 : n + sum_rec(n-1); 
} 

int main() 
{ 
    cout << sum(3) << endl; 
    return 0; 
} 

Một tốt hơn một nếu bạn C trình biên dịch hiện tối ưu hóa cuộc gọi đuôi:

// just a helper for sum_it 
int sum_aux (int n, int accumulator) 
{ 
    return n == 0 ? accumulator : sum_rec(n-1, accumulator + n); 
} 

int sum_it (int n) 
{ 
    sum_aux(n, 0); 
}