Recursive Double code to Calculate the sum of the square roots <= a number

  • #1
anonim
40
2
Homework Statement:
Calculate the sum of the square root
Relevant Equations:
-
C:
#include<stdio.h>
#include<math.h>
double foo(int n){
    if(n==1){
        return(1);
    }
    if(n!=0){
        return( sqrt((n)+foo(n-1) ) );
    }



}
int main(){
    int num;
    printf("Enter the number: ");
    scanf("%d",&num);
    foo(num);
    printf(" %lf ",foo(num));
   return(0);
}


I want to calculate the sum of the square root. For example if the input is 5, I want to calculate sqrt(5)+sqrt(4)+sqrt(3)+sqrt(2)+sqrt(1) recursively. But it does not work. If the input is 5, output -> 2.735877.
 

Answers and Replies

  • #2
FactChecker
Science Advisor
Homework Helper
Gold Member
7,723
3,392
It looks like your sqrt on line 8 includes more than you want it to.
 
  • #3
anonim
40
2
It looks like your sqrt on line 8 includes more than you want it to.
I think so, do you have any idea how I can fix this?
 
  • #4
FactChecker
Science Advisor
Homework Helper
Gold Member
7,723
3,392
Since this is a homework problem, I can only give hints. Make sure that what you have inside the parentheses of sqrt() is exactly what you want to take the sqrt of.
 
  • #5
anonim
40
2
Since this is a homework problem, I can only give hints. Make sure that what you have inside the parentheses of sqrt() is exactly what you want to take the sqrt of.
I tried a lot but it does not happen.. :( Anyway thank you for help.
 
  • #6
FactChecker
Science Advisor
Homework Helper
Gold Member
7,723
3,392
I tried a lot but it does not happen.. :( Anyway thank you for help.
Don't give up now. You are 99% done. Do you want sqrt(5)+sqrt(4)+... or sqrt( 5 + sqrt(4 + sqrt(3 + ...))))? Check that line. Your code now is calculating the second option.
 
  • #7
anonim
40
2
Don't give up now. You are 99% done. Do you want sqrt(5)+sqrt(4)+... or sqrt( 5 + sqrt(4 + sqrt(3 + ...))))? Check that line. Your code now is calculating the second option.
Code:
return( sqrt((n))+foo(n-1)  );
I write like this and it works. Now I'm wondering where I would write the (n) if I wanted to calculate it sqrt((5+4+3+2+1)/n) recursively.
 
  • #8
36,855
8,888
Code:
return( sqrt((n))+foo(n-1)  );
I write like this and it works.
You have more parentheses than you need. This would also work.
C:
return( sqrt(n)+foo(n-1)  );
Or even this:
C:
return sqrt(n)+foo(n-1) ;

The idea is that all of these do the same thing:
C:
return ((x) + (y));
return (x + y);
return x + y;
 
  • Like
Likes FactChecker
  • #9
FactChecker
Science Advisor
Homework Helper
Gold Member
7,723
3,392
Now I'm wondering where I would write the (n) if I wanted to calculate it sqrt((5+4+3+2+1)/n) recursively.
This is not well suited for a solution by recursion. (and what value does the denominator, n, have?). The only part that would work with recursion is the summation 5+4+3+2+1 :
C:
int sumDownToOne(int n){
    if(n==1){
        return(1);
    }
    if(n!=0){
        return( n+sumDownToOne(n-1) );
    }
}
And that is hardly worth it.

You should be aware that there are only certain things that recursion works well on. Recursion works well when a process can be done repetitively by applying the same process on a little simpler problem until it gets to the last repetition that is so simple that it can be done directly.
One of the best examples of an elegant solution using recursion is the Towers of Hanoi Problem. It is not easy to solve any other way, but is very simple to solve using recursion. See solving Towers of Hanoi using recursion.
 
Last edited:
  • #10
anonim
40
2
This is not well suited for a solution by recursion. (and what value does the denominator, n, have?). The only part that would work with recursion is the summation 5+4+3+2+1 :
C:
int sumDownToOne(int n){
    if(n==1){
        return(1);
    }
    if(n!=0){
        return( n+sumDownToOne(n-1) );
    }
}
And that is hardly worth it.

You should be aware that there are only certain things that recursion works well on. Recursion works well when a process can be done repetitively by applying the same process on a little simpler problem until it gets to the last repetition that is so simple that it can be done directly.
One of the best examples of an elegant solution using recursion is the Towers of Hanoi Problem. It is not easy to solve any other way, but is very simple to solve using recursion. See solving Towers of Hanoi using recursion.
not n, n-1. I typed wrong. Forget it and let's say I want to calculate standard deviation recursively.
 
  • #11
anonim
40
2
You have more parentheses than you need. This would also work.
C:
return( sqrt(n)+foo(n-1)  );
Or even this:
C:
return sqrt(n)+foo(n-1) ;

The idea is that all of these do the same thing:
C:
return ((x) + (y));
return (x + y);
return x + y;
Thanks!
 
  • #12
FactChecker
Science Advisor
Homework Helper
Gold Member
7,723
3,392
not n, n-1.
That still has the same problem since I don't know if n runs through a series of numbers or has a single, fixed, value.
I typed wrong. Forget it and let's say I want to calculate standard deviation recursively.
Recursion would not be a good way to calculate the Standard Deviation (SD). Are you aware of the formula for SD that only uses ##\sum {{x_i}^2}## and ##(\sum {x_i})^2##? That allows one to run through the data only once and calculate the SD after that.
 
  • #13
anonim
40
2
That still has the same problem since I don't know if n runs through a series of numbers or has a single, fixed, value.
Recursion would not be a good way to calculate the Standard Deviation (SD). Are you aware of the formula for SD that only uses ##\sum {{x_i}^2}## and ##(\sum {x_i})^2##? That allows one to run through the data only once and calculate the SD after that.
C:
#include<stdio.h>
#include<math.h>
double foo(int n, double mean){
    double square;
    if(n==1){
        return(1);
    }
    if(n!=0){
      
        return( (sqrt((n-mean)*(n-mean))+foo(n-1,mean))/(sqrt(n-1))  );
    }


}
int main(){
    int num;
    double mean;
    int i;
    int sum=0;
    printf("Enter the number: ");
    scanf("%d",&num);
    for(i=1; num>=i; i++){
        sum=sum+i;
    }
    mean=(double)sum/num;
    printf("%lf ",mean);
    foo(num,mean);

    printf(" %lf ",foo(num,mean));
}

I tried to write like this. But it does not work. https://i.pinimg.com/originals/b5/7c/a0/b57ca00c2aabd05bcb722295734ba2e6.png I tried the apply the formula in the link.
 
  • #14
FactChecker
Science Advisor
Homework Helper
Gold Member
7,723
3,392
I tried to write like this. But it does not work. https://i.pinimg.com/originals/b5/7c/a0/b57ca00c2aabd05bcb722295734ba2e6.png I tried the apply the formula in the link.
That is not calculating the same thing as the formula in the link. Notice that the n in the link has only one, fixed, value. It is the total number of data points. Your code keeps changing the value of n. In line 10, you have "foo(n-1,mean)", so it is passing in n-1, which keeps being reduced for each lower-level call.
I think that you are trying to use recursion where it just makes things more complicated.
 
  • #15
anonim
40
2
That is not calculating the same thing as the formula in the link. Notice that the n in the link has only one, fixed, value. It is the total number of data points. Your code keeps changing the value of n. In line 10, you have "foo(n-1,mean)", so it is passing in n-1, which keeps being reduced for each lower-level call.
I think that you are trying to use recursion where it just makes things more complicated.
at first I added another value that holds the number in the function like this;
Code:
#include<stdio.h>
#include<math.h>
double foo(int n, double mean, int n2){
    if(n==1){
        return(1);
    }
    if(n!=0){
     
        return( (sqrt((n-mean)*(n-mean))+foo(n-1,mean,n2))/(sqrt(n2-1))  );
    }


}
int main(){
    int num;
    int n2;
    double mean;
    int i;
    int sum=0;

    printf("Enter the number: ");
    scanf("%d",&num);
    n2=num;
    for(i=1; num>=i; i++){
        sum=sum+i;
    }
    mean=(double)sum/num;
    printf("%lf ",mean);
    foo(num,mean,n2);

    printf(" %lf ",foo(num,mean,n2));
}
 
  • #16
FactChecker
Science Advisor
Homework Helper
Gold Member
7,723
3,392
You are trying to use recursion where it just makes things harder. It is much easier to just use a for-loop to make the correct calculation. To see an example where recursion really simplifies things, see the link I gave in post #9 to the Towers of Hanoi problem.
 
  • #17
anonim
40
2
You are trying to use recursion where it just makes things harder. It is much easier to just use a for-loop to make the correct calculation. To see an example where recursion really simplifies things, see the link I gave in post #9 to the Towers of Hanoi problem.
Yes I can use loop but my teacher does not allow loop in this homework
 
  • #18
FactChecker
Science Advisor
Homework Helper
Gold Member
7,723
3,392
Yes I can use loop but my teacher does not allow loop in this homework
Did you teacher pick the example of standard deviation for recursion or is this your example? IMHO, it is a very bad example for recursion.
I would not use recursion in this example for anything except doing the summation, using code like I put in post #9. I would keep the sqrt() and the division by n out of the recursion and only do that after the recursive summation.
 
  • #19
36,855
8,888
Did you teacher pick the example of standard deviation for recursion or is this your example? IMHO, it is a very bad example for recursion.
From what I can tell, the assignment is something like this:
"Write a program in C that uses recursion."
The choice to implement a function that calculates the standard deviation or the sum of square roots or whatever seems to me the idea of the OP here.

@anonim, you could write a recursive program that calculates this:
$$\frac 1 N (\sqrt 1 + \sqrt 2 + \sqrt 3 + \dots + \sqrt N)$$

but this has nothing to do with standard deviation.

BTW, homework questions should be posted in this section, not in the Computer Science general section. I deleted your post there that seems to be a continuation of what you have started here.
 
  • #20
FactChecker
Science Advisor
Homework Helper
Gold Member
7,723
3,392
Another standard example of recursion is the factorial. Although it is not an example where the factorial is better than a simple loop, it is a simple example to program.
 

Suggested for: Recursive Double code to Calculate the sum of the square roots <= a number

Replies
7
Views
381
Replies
1
Views
833
  • Last Post
Replies
4
Views
708
Replies
102
Views
2K
Replies
8
Views
427
  • Last Post
Replies
2
Views
731
Replies
5
Views
1K
Top