1. Not finding help here? Sign up for a free 30min tutor trial with Chegg Tutors
    Dismiss Notice
Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Simple Recursive Function- returning nan

  1. Mar 27, 2013 #1
    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. jcsd
  3. Mar 27, 2013 #2

    Mark44

    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.
     
  4. Mar 27, 2013 #3

    DrClaude

    User Avatar

    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.
     
  5. Mar 27, 2013 #4
    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
  6. Mar 27, 2013 #5

    I like Serena

    User Avatar
    Homework Helper

    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.
     
  7. Mar 27, 2013 #6
    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
  8. Mar 27, 2013 #7

    I like Serena

    User Avatar
    Homework Helper

    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.
     
  9. Mar 27, 2013 #8

    I like Serena

    User Avatar
    Homework Helper

    Good! :smile:
     
  10. Mar 27, 2013 #9
    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.
     
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook

Have something to add?
Draft saved Draft deleted



Similar Discussions: Simple Recursive Function- returning nan
  1. Recursive function (Replies: 16)

Loading...