• C

# function is not correct...need help!

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*/

###### Who is Participating?

Commented:
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

Commented:
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

Commented:
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

Commented:
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
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.