Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > returning the fibonacci string separated by comma

Reply
Thread Tools

returning the fibonacci string separated by comma

 
 
mac
Guest
Posts: n/a
 
      02-13-2007
Hi,

I'm trying to write a fibonacci recursive function that will return
the fibonacci string separated by comma. The problem sounds like this:
-------------
Write a recursive function that creates a character string containing
the first n Fibonacci numbers - F(n) = F(n - 1) + F(n - 2), F(0) =
F(1) = 1 -, separated by comma. n should be given as an argument to
the program. The recursive function should only take one parameter, n,
and should return the string. You will not use any extra function.

Do not try to optimize for space or speed. Do not assume any maximum
length for the result string. Also, please don't use global / static
variables.
-----------

The code must be in C. I managed to create a function that returns the
fibonacci value for the specified 'N' as a char*, but I didn't manage
to get the entire string separated by comma.
This is my function:

char* Recursive(int n){
char* a = malloc(n*sizeof(char));
if(n == 0 || n == 1)
sprintf(a, "%d", n);
else
sprintf(a, "%d", atoi(Recursive(n-1)) +
atoi(Recursive(n-2)));
return a;
}


How could I get the entire string?
Thanks in advance for help!

 
Reply With Quote
 
 
 
 
Gavin Deane
Guest
Posts: n/a
 
      02-13-2007
On 13 Feb, 11:51, "mac" <andrei.croito...@gmail.com> wrote:
> Hi,
>
> I'm trying to write a fibonacci recursive function that will return
> the fibonacci string separated by comma. The problem sounds like this:
> -------------
> Write a recursive function that creates a character string containing
> the first n Fibonacci numbers - F(n) = F(n - 1) + F(n - 2), F(0) =
> F(1) = 1 -, separated by comma. n should be given as an argument to
> the program. The recursive function should only take one parameter, n,
> and should return the string. You will not use any extra function.
>
> Do not try to optimize for space or speed. Do not assume any maximum
> length for the result string. Also, please don't use global / static
> variables.
> -----------
>
> The code must be in C.


Really? Because this is a C++ newsgroup. comp.lang.c is just down the
hall and will be able to help you better if C++ is not allowed.

> I managed to create a function that returns the
> fibonacci value for the specified 'N' as a char*, but I didn't manage
> to get the entire string separated by comma.
> This is my function:
>
> char* Recursive(int n){
> char* a = malloc(n*sizeof(char));
> if(n == 0 || n == 1)
> sprintf(a, "%d", n);
> else
> sprintf(a, "%d", atoi(Recursive(n-1)) +
> atoi(Recursive(n-2)));
> return a;
> }
>
> How could I get the entire string?
> Thanks in advance for help!


There are problems with your program so far. You are seeing the nth
fibonacci number returned, but think about what memory the other
fibonacci numbers are stored in. You have explicit allocation with no
explicit deallocation, so you leak memory. The buffer you allocate
(size n*sizeof(char)) is not big enough if any of the fibonacci
numbers have more than one digit. This depends entirely on the value
of n. In C++, sizeof char is 1 by definition so multiplying n by
sizeof char is redundant. I would be surprised (but I am prepared to
be surprised) if the same is not true in C.

All of that should be fixable, but before looking for help here, can
you confirm which language you are working in? For help in C, ask in
comp.lang.c. They will be better able to help you. If you really are
happy with a C++ solution (for which the first change will be to ditch
char*, malloc and sprintf in favour of std::string) then come back
here and you will get plenty of help with that.

Gavin Deane

 
Reply With Quote
 
 
 
 
dasjotre
Guest
Posts: n/a
 
      02-13-2007
On 13 Feb, 11:51, "mac" <andrei.croito...@gmail.com> wrote:
> Hi,


Hi, this is off-topic (not C++) and obviously a coursework
so I will give you hints only

> char* Recursive(int n){
> char* a = malloc(n*sizeof(char));


(malloc returns void* not char*).

You should allocate enough space to print
all Fibonacci numbers from n to 0 with
all the commas and formatting required
so if Recursive(4) should return string like
"0,1,1,2" the allocated length should
be 8 chars not 4. It gets more complicated
for numbers with more than one digit.

!don't forget the null terminator!

> if(n == 0 || n == 1)


This will stop recursion when n==1 so 0 will
never be printed.

> sprintf(a, "%d", n);
> else
> sprintf(a, "%d", atoi(Recursive(n-1)) +
> atoi(Recursive(n-2)));


If n is not 0 you have to sprintf the
result of Recursive(n-1) which is char *
(lookup %s sprintf format specification)
and the n-th Fibonacci number and the
desired format (commas etc...).

if your initial input is 4, Recursive(4) calls
Recursive(4-1) (which returns "0,1,1")
which calls Recursive(4-2) (which returns
"0,1") etc..

Make sure you deallocate memory returned
from recursive call to Recursive (better names
please!)

> return a;
>
> }



 
Reply With Quote
 
Gavin Deane
Guest
Posts: n/a
 
      02-13-2007
On 13 Feb, 12:40, "dasjotre" <dasjo...@googlemail.com> wrote:
> On 13 Feb, 11:51, "mac" <andrei.croito...@gmail.com> wrote:
>
> > Hi,

>
> Hi, this is off-topic (not C++) and obviously a coursework
> so I will give you hints only
>
> > char* Recursive(int n){
> > char* a = malloc(n*sizeof(char));

>
> (malloc returns void* not char*).


Whether that line is correct depends on whether the OP is writing C or
C++. In C++ you need to cast the result of malloc. In C, as I
understand it, you must not cast the result of malloc. So if the code
is C, as the OP suggests, I believe it is correct.

<snip>

> > if(n == 0 || n == 1)

>
> This will stop recursion when n==1 so 0 will
> never be printed.


If n>1, the OP's Recursive function calls Recursive(n-1) AND
Recursive(n-2), so unless the recursion logic has dissolved my brain
(a possibility), n == 0 will happen when Recursive(n) for n==2 calls
Recursive(n-2).

<snip>

Gavin Deane

 
Reply With Quote
 
dasjotre
Guest
Posts: n/a
 
      02-13-2007
On 13 Feb, 12:54, "Gavin Deane" <deane_ga...@hotmail.com> wrote:
> On 13 Feb, 12:40, "dasjotre" <dasjo...@googlemail.com> wrote:
>
> > On 13 Feb, 11:51, "mac" <andrei.croito...@gmail.com> wrote:

>
> > > Hi,

>
> > Hi, this is off-topic (not C++) and obviously a coursework
> > so I will give you hints only

>
> > > char* Recursive(int n){
> > > char* a = malloc(n*sizeof(char));

>
> > (malloc returns void* not char*).

>
> Whether that line is correct depends on whether the OP is writing C or
> C++. In C++ you need to cast the result of malloc. In C, as I
> understand it, you must not cast the result of malloc. So if the code
> is C, as the OP suggests, I believe it is correct.
>
> <snip>
>
> > > if(n == 0 || n == 1)

>
> > This will stop recursion when n==1 so 0 will
> > never be printed.

>
> If n>1, the OP's Recursive function calls Recursive(n-1) AND
> Recursive(n-2), so unless the recursion logic has dissolved my brain
> (a possibility), n == 0 will happen when Recursive(n) for n==2 calls
> Recursive(n-2).
>
> <snip>


Yes, but the OP's sollution is completely wrong. My hinted
sollution calls Recursive recursively only once per Recursive
(my head hurts) so n will be 0 only if Recursive is initially
called with 0.

Regards.



 
Reply With Quote
 
dasjotre
Guest
Posts: n/a
 
      02-13-2007
On 13 Feb, 12:54, "Gavin Deane" <deane_ga...@hotmail.com> wrote:
> On 13 Feb, 12:40, "dasjotre" <dasjo...@googlemail.com> wrote:
>
> > On 13 Feb, 11:51, "mac" <andrei.croito...@gmail.com> wrote:

>
> > > Hi,

>
> > Hi, this is off-topic (not C++) and obviously a coursework
> > so I will give you hints only

>
> > > char* Recursive(int n){
> > > char* a = malloc(n*sizeof(char));

>
> > (malloc returns void* not char*).

>
> Whether that line is correct depends on whether the OP is writing C or
> C++. In C++ you need to cast the result of malloc. In C, as I
> understand it, you must not cast the result of malloc. So if the code
> is C, as the OP suggests, I believe it is correct.
>
> <snip>
>
> > > if(n == 0 || n == 1)

>
> > This will stop recursion when n==1 so 0 will
> > never be printed.

>
> If n>1, the OP's Recursive function calls Recursive(n-1) AND
> Recursive(n-2), so unless the recursion logic has dissolved my brain
> (a possibility), n == 0 will happen when Recursive(n) for n==2 calls
> Recursive(n-2).
>
> <snip>


Yes, but the OP's sollution is completely wrong. My hinted
sollution calls Recursive recursively only once per Recursive
(my head hurts) so n will be 0 only if Recursive is initially
called with 0.

Regards.



 
Reply With Quote
 
dasjotre
Guest
Posts: n/a
 
      02-13-2007
On 13 Feb, 12:54, "Gavin Deane" <deane_ga...@hotmail.com> wrote:
> On 13 Feb, 12:40, "dasjotre" <dasjo...@googlemail.com> wrote:
>
> > On 13 Feb, 11:51, "mac" <andrei.croito...@gmail.com> wrote:

>
> > > Hi,

>
> > Hi, this is off-topic (not C++) and obviously a coursework
> > so I will give you hints only

>
> > > char* Recursive(int n){
> > > char* a = malloc(n*sizeof(char));

>
> > (malloc returns void* not char*).

>
> Whether that line is correct depends on whether the OP is writing C or
> C++. In C++ you need to cast the result of malloc. In C, as I
> understand it, you must not cast the result of malloc. So if the code
> is C, as the OP suggests, I believe it is correct.
>
> <snip>
>
> > > if(n == 0 || n == 1)

>
> > This will stop recursion when n==1 so 0 will
> > never be printed.

>
> If n>1, the OP's Recursive function calls Recursive(n-1) AND
> Recursive(n-2), so unless the recursion logic has dissolved my brain
> (a possibility), n == 0 will happen when Recursive(n) for n==2 calls
> Recursive(n-2).
>
> <snip>


Yes, but the OP's sollution is completely wrong. My hinted
sollution calls Recursive recursively only once per Recursive
(my head hurts) so n will be 0 only if Recursive is initially
called with 0.

Regards.



 
Reply With Quote
 
dasjotre
Guest
Posts: n/a
 
      02-13-2007
On 13 Feb, 12:54, "Gavin Deane" <deane_ga...@hotmail.com> wrote:
> On 13 Feb, 12:40, "dasjotre" <dasjo...@googlemail.com> wrote:
>
> > On 13 Feb, 11:51, "mac" <andrei.croito...@gmail.com> wrote:

>
> > > Hi,

>
> > Hi, this is off-topic (not C++) and obviously a coursework
> > so I will give you hints only

>
> > > char* Recursive(int n){
> > > char* a = malloc(n*sizeof(char));

>
> > (malloc returns void* not char*).

>
> Whether that line is correct depends on whether the OP is writing C or
> C++. In C++ you need to cast the result of malloc. In C, as I
> understand it, you must not cast the result of malloc. So if the code
> is C, as the OP suggests, I believe it is correct.
>
> <snip>
>
> > > if(n == 0 || n == 1)

>
> > This will stop recursion when n==1 so 0 will
> > never be printed.

>
> If n>1, the OP's Recursive function calls Recursive(n-1) AND
> Recursive(n-2), so unless the recursion logic has dissolved my brain
> (a possibility), n == 0 will happen when Recursive(n) for n==2 calls
> Recursive(n-2).
>
> <snip>


Yes, but the OP's sollution is completely wrong. My hinted
sollution calls Recursive recursively only once per Recursive
(my head hurts) so n will be 0 only if Recursive is initially
called with 0.

Regards.



 
Reply With Quote
 
dasjotre
Guest
Posts: n/a
 
      02-13-2007
On 13 Feb, 12:54, "Gavin Deane" <deane_ga...@hotmail.com> wrote:
> On 13 Feb, 12:40, "dasjotre" <dasjo...@googlemail.com> wrote:
>
> > On 13 Feb, 11:51, "mac" <andrei.croito...@gmail.com> wrote:

>
> > > Hi,

>
> > Hi, this is off-topic (not C++) and obviously a coursework
> > so I will give you hints only

>
> > > char* Recursive(int n){
> > > char* a = malloc(n*sizeof(char));

>
> > (malloc returns void* not char*).

>
> Whether that line is correct depends on whether the OP is writing C or
> C++. In C++ you need to cast the result of malloc. In C, as I
> understand it, you must not cast the result of malloc. So if the code
> is C, as the OP suggests, I believe it is correct.
>
> <snip>
>
> > > if(n == 0 || n == 1)

>
> > This will stop recursion when n==1 so 0 will
> > never be printed.

>
> If n>1, the OP's Recursive function calls Recursive(n-1) AND
> Recursive(n-2), so unless the recursion logic has dissolved my brain
> (a possibility), n == 0 will happen when Recursive(n) for n==2 calls
> Recursive(n-2).
>
> <snip>


Yes, but the OP's sollution is completely wrong. My hinted
sollution calls Recursive recursively only once per Recursive
(my head hurts) so n will be 0 only if Recursive is initially
called with 0.

Regards.



 
Reply With Quote
 
dasjotre
Guest
Posts: n/a
 
      02-13-2007
On 13 Feb, 13:26, "dasjotre" <dasjo...@googlemail.com> wrote:
<>
sorry, my reader has gone beserk.

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
comma separated String conversion NickPick Java 7 03-03-2009 02:10 AM
returning the Fibonacci string separated by comma mac C Programming 17 02-14-2007 05:43 PM
Parsing a Comma Separated String in C ronan_40060 C Programming 1 12-22-2006 10:03 AM
How to stream a comma separated string to the browser? =?Utf-8?B?Q2hyaXMgTGFuZQ==?= ASP .Net 1 07-21-2006 07:00 PM
Array to a comma Separated String Peter Rilling ASP .Net 3 07-08-2004 05:53 PM



Advertisments
 



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57