Name:
Anonymous
2011-10-19 21:09
How do i make this function tail recursive in java
public int fib(int n)
{
return( n <= 1 ? n : fib(n-1) + fib(n-2) );
}
Name:
Anonymous
2011-10-20 1:10
I still don't know what tail-recursion is, is this tail-recursive?
#include <stdio.h>
#include <stdlib.h>
#define lambda(...) \
({ \
int (*__lambda_fptr) (__VA_ARGS__); \
int __lambda (__VA_ARGS__)
#define lambda_end \
__lambda_fptr = __lambda; \
})
#define cases(n) \
({ \
int __cases_value; \
switch (n)
#define yields(v) __cases_value = (v); break;
#define cases_end \
__cases_value; \
})
int fib (n) {
typedef int (*fn) (int, int, int);
fn fo = lambda (int p, int h, int i) {
return cases (i) {
case 0 : yields (p)
case 1 : yields (h)
case 2 : yields (p + h)
default : yields (fo (h, p + h, i - 1))
} cases_end;
} lambda_end;
return fo (1, 1, n);
}
int main (int argc, char **argv) {
while (--argc)
printf ("%d\n", fib (atol (*++argv)));
return 0;
}
It calculates this pretty fast when compiled without any optimization:
[~/C] time ./a.out `seq 0 40`
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
10946
17711
28657
46368
75025
121393
196418
317811
514229
832040
1346269
2178309
3524578
5702887
9227465
14930352
24157817
39088169
63245986
102334155
165580141
real 0m0.016s
user 0m0.001s
sys 0m0.015s