Simple Recursive Function- returning nan

AI Thread Summary
The discussion revolves around a recursive function for simulating population growth that returns "nan" due to improper handling of variable passing. The main issue identified is that the function does not return the final value correctly because it fails to return the computed value of X in the recursive calls. It is suggested to pass X by reference to ensure that changes persist across recursive calls, and to avoid passing timeSteps as a pointer since it serves no purpose. The user successfully resolves the "nan" issue by modifying the function to return X correctly and passing it by reference, leading to the desired output. The conversation highlights the importance of understanding variable passing in recursive functions.
sandy.bridge
Messages
797
Reaction score
1
Simple Recursive Function-- returning "nan"

Homework Statement


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:
#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:
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:
Physics news on Phys.org
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.
 
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.
 
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:
Try it with:
Code:
double growth(int timeSteps, double r, double& X)
It means that X is passed by reference instead of by value.
 
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:
#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:
sandy.bridge said:
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.

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.
 
sandy.bridge said:
EDIT: I got the desired results! THANKS A BUNCH!

Good! :smile:
 
I have not learned 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.
 

Similar threads

Replies
2
Views
3K
Replies
3
Views
1K
Replies
8
Views
1K
Replies
7
Views
2K
Replies
9
Views
2K
Replies
23
Views
3K
Back
Top