Say we're writing a simple recursive function fib(n)
that calculates the nth Fibonacci number. Now, we want the function to print that nth number. As the same function is being called repeatedly, there has to be a condition that allows only the root call to print. The question is: how to write this condition without passing any additional arguments, or using global/static variables.
So, we're dealing with something like this:
int fib(int n) {
if(n <= 0) return 0;
int fn = 1;
if(n > 2) fn = fib(n-2) + fib(n-1);
if(???) cout << fn << endl;
return fn;
}
int main() {
fib(5);
return 0;
}
I thought that the root call differs from all children by returning to a different caller, namely the main method in this example. I wanted to know whether it is possible to use this property to write the condition and how.
Update: please note that this is a contrived example that only serves to present the idea. This should be clear from the tags. I'm not looking for standard solutions. Thanks.
Thus in our case, the number of recursive calls is n0 +n2 = 2n0 −1, which means that the total number of recursive calls is equal to 2Fn+1 − 1. This way, we have reached the same result with [2], however, in a much simpler way from the mathematical and pedagogical point of view.
A recursive call is one where procedure A calls itself or calls procedure B which then calls procedure A again. Each recursive call causes a new invocation of the procedure to be placed on the call stack.
Yes, it has to be pass by reference.
The way I would do this is with a helper function:
int _fib(int n) {
if(n <= 0) return 0;
int fn = 1;
if(n > 2) fn = _fib(n-2) + _fib(n-1);
return fn;
}
int fib(int n) {
int fn=_fib(n);
cout << fn << endl;
return fn;
}
Alternatively, you could write it like this (c++):
int fib(int n, bool f=true) {
if(n <= 0) return 0;
int fn = 1;
if(n > 2) fn = fib(n-2, false) + fib(n-1, false);
if(f) cout << fn << endl;
return fn;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With