Go Premium for a chance to win a PS4. Enter to Win

x
?
Solved

function is not correct...need help!

Posted on 2000-03-01
4
Medium Priority
?
182 Views
Last Modified: 2010-04-15
The functions defined below. a call to the function factors(n), where n is a positive integer, is suppose to print all factors of n. however, the code is not correct. the function call factors(30);
should result in the output:
   1 2 3 5 6 10 15 30

(a) what is the actual output of the call factors(30);
(b) what modification(s) should be made to the code so it correctly     produces the factors of any given positive integer number?

    void facts(int val,int div)
           {
           if(div= =val)
              printf("%d \n",div);
           else
           {
             if (val % div ==0)
               {
                printf("%d \n",div);
                facts(val,div+1);
                }
           }
          }/*end of facts*/

    void factors(int val)
         {
          facts(val,1);
         }/*end of factors*/

thanks in advance!
0
Comment
Question by:beachbumm
  • 3
4 Comments
 
LVL 31

Accepted Solution

by:
Zoppo earned 100 total points
ID: 2573056
Hi beachbumm,

problem is that you only call facts() recursive in facts() if ( val%div == 0), so i.e. if val=30 and div=4 the function terminates without calling facts() again.

This function for example does what you want to:

void facts(int val,int div)
{
 while ( val % div !=0 && div < val )
  div++;

 printf("%d ",div);

 if ( div < val )
  facts( val, div+1 );
}/*end of facts*/

void factors(int val)
{
 facts(val,1);
 printf( "\n" );
}/*end of factors*/

hope that helps,

ZOPPO
0
 
LVL 30

Expert Comment

by:SteveGTR
ID: 2573150
Zoppo is correct. Here's a version that follows your original code base:

void facts(int val,int div)
{
  if (div == val)
    printf("%d \n", div);
  else
    {
    if (val % div == 0)
      printf("%d \n", div);

    facts(val, div+1);
    }
}

void factors(int val)
{
  facts(val, 1);
}
0
 
LVL 31

Expert Comment

by:Zoppo
ID: 2573206
SteveGTR's code is ok too, but a significant difference to mine I think is the recursion depth. My function's recursion depth depends on the 'hits' (how often val%dir==0), SteveGTR function's recursion depth is val-div.

so, i.e. factors( 10000 ) will give following:

1 2 4 5 8 10 16 20 25 40 50 80 100 125 200 250 400 500 625 1000 1250 2000 2500 5000 10000
My function: 25 calls
SteveGTR's function: 10000 calls

ZOPPO
0
 
LVL 31

Expert Comment

by:Zoppo
ID: 2575634
BTW, why do you want this to be recursive at all? It's quit simple to do this none-recursive like this:

int facts(int val,int div)
{
 while ( div < val )
 {
  while ( val % div !=0 )
   div++;
  printf("%d ",div);
  div++;
 }
}/*end of facts*/

ZOPPO
0

Featured Post

Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Summary: This tutorial covers some basics of pointer, pointer arithmetic and function pointer. What is a pointer: A pointer is a variable which holds an address. This address might be address of another variable/address of devices/address of fu…
Windows programmers of the C/C++ variety, how many of you realise that since Window 9x Microsoft has been lying to you about what constitutes Unicode (http://en.wikipedia.org/wiki/Unicode)? They will have you believe that Unicode requires you to use…
The goal of this video is to provide viewers with basic examples to understand how to use strings and some functions related to them in the C programming language.
The goal of this video is to provide viewers with basic examples to understand how to create, access, and change arrays in the C programming language.
Suggested Courses

926 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question