Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   C Programming (http://www.velocityreviews.com/forums/f42-c-programming.html)
-   -   converting recursive function to iterative (http://www.velocityreviews.com/forums/t614160-converting-recursive-function-to-iterative.html)

V 05-11-2008 11:21 AM

converting recursive function to iterative
 
Hello:

Consider the following recursive function:

inline u64 multiplyPower(u64 V, u8 i, u64 c)
{
if (i == 0)
return V;
else
return mul( multiplyPower(V,i-1,c) , c);
}

where mul is defined as:
inline u64 mul(u64 V, u64 c)
{
if ((V & 0x8000000000000000 ))
return (V<<1) ^ c;
else
return V<<1;
}

I would like to convert the recursive function multiplyPower() to an
iterative one. Does it look possible? Can some one please help.
Thanks!

Spiros Bousbouras 05-11-2008 11:45 AM

Re: converting recursive function to iterative
 
On 11 May, 12:21, V <vishal.st...@gmail.com> wrote:
> Hello:
>
> Consider the following recursive function:
>
> inline u64 multiplyPower(u64 V, u8 i, u64 c)
> {
> if (i == 0)
> return V;
> else
> return mul( multiplyPower(V,i-1,c) , c);
>
> }
>
> where mul is defined as:
> inline u64 mul(u64 V, u64 c)
> {
> if ((V & 0x8000000000000000 ))
> return (V<<1) ^ c;
> else
> return V<<1;
>
> }
>
> I would like to convert the recursive function multiplyPower() to an
> iterative one. Does it look possible? Can some one please help.


Yes it is possible and quite easy. I am however reluctant
to provide you with a complete answer since this looks
like homework. I will try to give you some hints although
I think it will be hard finding the middle point between
trivial (hence unhelpful) hints and a complete solution.

First, the code for mul is irrelevant. As long as you know
the return type, that's all you need to turn the recursion
into a loop. Second, try working out on a piece of paper
the symbolic result of multiplyPower for small functions
of i and see if that gives you a hint.

For example
i=0 multiplyPower returns V
i=1 multiplyPower returns mul(V,c)

V 05-13-2008 01:54 AM

Re: converting recursive function to iterative
 
Following is what I can think of...but it doesn't seem to be working ;-
( Any pointers...Thanks!

inline u64 multiplyPower_iter (u64 V, u8 i, u64 c)
{
u64 result=1;
int j;

if ((i == 0))
return V;
else
{
{
while (i--)
{
result *= 2;
}

result *= mul (V,c);
}
return result;
}
}

V 05-13-2008 02:04 AM

Re: converting recursive function to iterative
 

Mistyped one thing (shown as CORRECTION below)...but still doesn't
work ;-(

n May 12, 6:54 pm, V <vishal.st...@gmail.com> wrote:
> Following is what I can think of...but it doesn't seem to be working ;-
> ( Any pointers...Thanks!
>
> inline u64 multiplyPower_iter (u64 V, u8 i, u64 c)
> {
> u64 result=1;
> int j;
>
> if ((i == 0))
> return V;
> else
> {
> {

CORRECTION----> i--;
> while (i--)
> {
> result *= 2;
> }
>
> result *= mul (V,c);
> }
> return result;
> }
>
> }



Ben Bacarisse 05-13-2008 02:08 PM

Re: converting recursive function to iterative
 
V <vishal.study@gmail.com> writes:

> Mistyped one thing (shown as CORRECTION below)...but still doesn't
> work ;-(


Did you follow Spiros Bousbouras advice?

The recursive version does this:

i=0 return V
i=1 return mul(mp(V,0,c),c) i.e. mul(V,c)
i=2 return mul(mp(V,1,c),c) i.e. mul(mul(V,c),c)
i=3 return mul(mp(V,2,c),c) i.e. mul(mul(mul(V,c),c),c),c)

You need to repeatedly apply mul to V which is not what your code
does.

--
Ben.


All times are GMT. The time now is 04:52 PM.

Powered by vBulletin®. Copyright ©2000 - 2013, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.