2009-11-20 28 views
6

Tôi đang chơi xung quanh với một code golf question yesterday for building a christmas tree đó đến khoảng năm ngoái và tôi đã ném cùng một thuật toán đệ quy nhanh chóng để thực hiện công việc:Func <> có thể tự gọi là đệ quy không?

static string f(int n, int r) 
{ 
    return "\n".PadLeft(2 * r, '*').PadLeft(n + r) 
     + (r < n ? f(n, ++r) : "*".PadLeft(n)); 
} 

tôi đã tự hỏi nếu tôi có thể làm điều tương tự với một Func:

Func<int,int,string> f = (n, r) => { 
    return "\n".PadLeft(2 * r, '*').PadLeft(n + r) 
     + (r < n ? f(n, ++r) : "*".PadLeft(n)); 
}; 

này sẽ thực hiện công việc ngoại trừ phần đệ quy không nhận ra rằng cuộc gọi đến f thực sự là một lời kêu gọi của chính nó. Điều này sẽ dẫn tôi đến kết luận rằng một Func không thể tự gọi một cách đệ quy - nhưng tôi tự hỏi liệu tôi có đưa ra kết luận sai hay nếu nó có thể được thực hiện nhưng yêu cầu một cách tiếp cận khác.

Bất kỳ ý tưởng nào?

+0

Giống như http://stackoverflow.com/questions/1079164/c-recursive-functions-with-lambdas? –

Trả lời

15
Func<int, int, string> f = null; 
f = (x, y) => f(x, y); 

Rõ ràng điều này sẽ gây ra StackOverflowException, nhưng bạn có ý tưởng.

+0

Nhận xét tốt về StackOverflowException. –

+1

LOL - Tôi có được ý chính của nó. Nó quá tệ, bạn không thể làm tất cả trong một dòng duy nhất mặc dù. Cảm ơn. – BenAlabaster

+1

Phát ngay. Mã của Ben là bất hợp pháp vì những lý do tương tự như 'int i = i + 1;' Cũng lưu ý rằng khối mã của f có thể gán lại giá trị của f, điều này sẽ gây trở ngại nhưng hoàn toàn hợp pháp. –

5

Xem this cho rất phạm vi bảo hiểm geeky của lambdas đệ quy, điểm cố định, bộ phối âm Y, v.v. Rất thú vị.

+1

Rất thú vị đọc - nhưng nó đau đầu của tôi: P – BenAlabaster

Các vấn đề liên quan