# Homework Help: Simple Recursive Function- returning nan

1. Mar 27, 2013

### sandy.bridge

Simple Recursive Function-- returning "nan"

1. The problem statement, all variables and given/known data
I have a program that is supposed to simulate a growth population. The details are not of much importance. It is a rather simple program, however, I am having problems with the program returning the final value that it has stored in X. It returns "nan", which means not a number, however, I am not seeing why. Perhaps one of you do? Thanks in advance!

Code (Text):

#include <iostream>
using namespace std;

double growth(int timeSteps, double r, double X)
{
if(timeSteps >= 0)
{
if (X < 0)
{
X = 0;
}
else if (X > 1)
{
X = 1;
}

cout << timeSteps << " " << X << endl;
X = r*X*(1-X);
timeSteps = timeSteps - 1;
growth(timeSteps, r, X);
if(timeSteps==0){return X;}
}
}

int main() {
cout << "Specify model parameters (Time limit, Growth, Initial Population): ";
double X, r;
int timeSteps;
cin >> timeSteps >> r >> X;
cout << "Time " << "Population" << endl;
double R = growth(timeSteps, r, X);
cout << "The final population was:  " << R;

return 0;
}

Here is an example of the console:
Code (Text):

Specify model parameters (Time limit, Growth, Initial Population): 5 1 0.5
Time Population
5 0.5
4 0.25
3 0.1875
2 0.152344
1 0.129135
0 0.112459
The final population was:  nan

I am wanting the final population to output Population when Time is 0.

Last edited: Mar 27, 2013
2. Mar 27, 2013

### Staff: Mentor

What happens if X is between 0 and 1? I.e., 0 <= X <= 1. You're checking only for X < 0 and X > 1. That could be dangerous in a recursive routine.

Also, I would be more inclined to use double variables rather than floats.

Judicious use of a debugger would show exactly why you're getting NAN for your final value.

3. Mar 27, 2013

### Staff: Mentor

Only the last instance of growth will "return X". The others, including the one called from main, terminate without a return.

Variables are passed by value, so neither timeSteps nor X are modified by the recursive calls to growth. You need to pass a pointer for timeSteps and catch the return value of growth.

4. Mar 27, 2013

### sandy.bridge

I edited my post to make it a bit easier to follow. I also changed the little things that I can.

I will also have to read into pointers a bit more.

I have declared timeSteps as a pointer in the main function. I then passed the pointer into the function. What do you mean by "catch the return value of growth"?

Last edited: Mar 27, 2013
5. Mar 27, 2013

### I like Serena

Try it with:
Code (Text):
double growth(int timeSteps, double r, double& X)
It means that X is passed by reference instead of by value.

6. Mar 27, 2013

### sandy.bridge

Do I still want to pass the time value as a pointer? I did as you said and I am no longer getting "nan"; I am however, getting 0.0998122.

Code (Text):

#include <iostream>
using namespace std;

double growth(int timeSteps, double r, double &X)
{
if(timeSteps >= 0)
{
if (X < 0)
{
X = 0;
}
else if (X > 1)
{
X = 1;
}

cout << timeSteps << " " << X << endl;
X = r*X*(1-X);
timeSteps = timeSteps - 1;
growth(timeSteps, r, X);
}
return X;
}

int main() {
cout << "Specify model parameters (Time limit, Growth, Initial Population): ";
double X, r;
int timeSteps;
cin >> timeSteps >> r >> X;
int *timeSteps_ptr = &timeSteps;
cout << "Time " << "Population" << endl;
double R = growth(*timeSteps_ptr, r, X);
cout << "The final population was:  " << R;

return 0;
}

EDIT: I think I know the issue though. It is giving me the value for X after the time value passes zero. I will tinker a bit with it and see what I come up with.

EDIT: I got the desired results!!!!!! THANKS A BUNCH!!!!!!!!!!

Last edited: Mar 27, 2013
7. Mar 27, 2013

### I like Serena

You are not passing the time value as a pointer.
As it is, you first convert it into a pointer, but then you dereference it again, so you still pass it by value.
Anyway, it serves no purpose to pass the time value as a pointer or as a reference.

8. Mar 27, 2013

### I like Serena

Good!

9. Mar 27, 2013

### sandy.bridge

I have not learnt about this '&' yet, and I don't think I will considering I am at the end of my course! Is a nifty little trick, though. Thanks.