2009-08-22 48 views
5

Tôi có chức năng đệ quy với biến tĩnh "đếm". Số gia tăng hàm đếm đệ quy và vì nó có phạm vi tệp, khi tôi gọi foo() lần thứ hai, số vẫn bằng 5. Có kỹ thuật đặt lại số 0 trước lần thứ hai foo() được gọi không?Chức năng đệ quy với biến tĩnh

Về cơ bản, tôi không muốn đếm có phạm vi tệp nhưng tôi muốn nó giữ lại giá trị của nó thông qua các lần lặp khác nhau.

Một cách tôi có thể nghĩ đến việc thực hiện nó là có một đối số trong foo() để khởi tạo foo(). Chẳng hạn như foo (int count). Nhưng có cách nào khác không?

#include <iostream> 

using namespace std; 

void foo() 
{ 
    static int count = 0; 

    if(count<5) 
    { 
     count++; 
     cout<<count<<endl; 
     foo(); 
    } 
    else 
    { 
     cout<<"count > 5"<<endl; 
    } 
} 

int main() 
{ 
    foo(); //increment count from 0 to 5 
    foo(); //count is already at 5 

    return 0; 
} 
+1

Có lý do cụ thể nào mà bạn đang sử dụng số tĩnh thay vì chuyển nó làm tham số không? Sử dụng các biến tĩnh trong các hàm đệ quy như thế này được coi là một ý tưởng tồi, chính xác vì những thứ như thế này. –

+0

Không có lý do cụ thể cho tĩnh. Từ những câu trả lời dưới đây, tôi sẽ đồng ý rằng một cuộc tranh luận sẽ là cách tốt nhất để giải quyết vấn đề này. – Steve

Trả lời

19

Một cách thành ngữ hơn là để chia nó thành hai chức năng:

void foo() { 
    foo_recursive(0); 
} 

void foo_recursive(int count) { 
    if (count < 5) { 
     count++; 
     cout << count << endl; 
     foo_recursive(count); 
    } else { 
     cout << "count > 5" << endl; 
    } 
} 

Trong đó có các lợi ích của việc không yêu cầu người gọi để cung cấp một cuộc tranh cãi để foo() và cũng có thể bạn không cần một biến tĩnh (mà Tôi luôn luôn cảm thấy là một ý tưởng tồi).

+2

Đây có lẽ là cách tốt nhất để làm điều đó. 1 Trừ khi có một số lý do kỳ lạ mà anh ta cần một biến tĩnh cho điều này ... –

+2

Mặc định đối số là có, do đó bạn không cần phải thực hiện một chức năng mới. Chúng tôi đang sử dụng C++ ở đây. void foo (int count = 0) { – Potatoswatter

+4

Đối số mặc định sẽ là các giá trị lựa chọn mặc định về cơ bản nằm ở phía bên của người gọi. Tuy nhiên, đối số trong trường hợp này là chi tiết triển khai và phải được ẩn sau một hàm khác.Bạn không muốn người gọi vượt qua "100" như đếm, phải không? –

6

Đặt nó trong khác

else 
{ 
    cout<<"count > 5"<<endl; 
    count = 0; 
} 

Nếu bạn muốn đệ quy đúng cách kiểm tra câu trả lời bombycilla của.

+0

Điều này nghe có vẻ giống như cách tốt nhất. (+1) –

4

Thay vì sử dụng biến tĩnh, chỉ cần chuyển số dưới dạng đối số.

void foo(int count) { 
    if (count < 5) { 
     count++; 
     cout << count << endl; 
     foo(count); 
    } else { 
     cout << "count > 5" << endl; 
    } 
} 

int main() { 
    foo(0); 
    foo(0); 
} 

Biến tĩnh và đệ quy thường không đi cùng nhau.

0

Bạn có thể thay đổi foo để chấp nhận biến boolean có nghĩa là đặt lại hay không.

void foo() { 
    foo(false); 
} 

void foo(int b) 
{ 
    static int count = 0; 

    if(b) { count = 0 }; 

    ... 
} 

gọi foo() như trước hoặc foo (true), nếu bạn muốn đặt lại.

0

Bạn có thể tận dụng chức năng tự động thiết lập lại theo cách này:

void foo() { 
    if (count >= 5) { 
    cout<<"count >= 5"<<endl; 
    count = 0; 
    return; 
    } 

    cout<<++count<<endl; 

    foo(); 
} 

Tiết kiệm mã boilerplate.

0
void foo() { 
    ... 
    if (count > 0) count--; // you can decrease it at then end of foo() 
} 
1

Làm thế nào về vấn đề này

count = (count+1)%5 
0

Không cần phải tuyên bố hai chức năng hoặc sử dụng biến tĩnh. Bạn có thể sử dụng đối số mặc định.

// Use Default arguments 
void foo(int count = 0); 

void foo(int count) 
{ 
    if(count<5) 
    { 
     count++; 
     cout<<count<<endl; 
     foo(count); 
    } 
    else 
    { 
     cout<<"count > 5"<<endl; 
    } 
} 

int main() 
{ 
    foo(); // by default argument =0 
    foo(); // by default argument =0 

    return 0; 
} 
Các vấn đề liên quan