Simple Recursive Function- returning nan

Join the discussion
Ask a follow-up here, or get your own question answered by working scientists, mathematicians and engineers — people, not an autocomplete.
Real named experts · corrections over time · the nuance an AI answer skips
8 replies · 2K views
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:
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.
 
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.