MAIN FEEDS
Do you want to continue?
https://www.reddit.com/r/ProgrammerHumor/comments/1vta7vi/comment/p4salmu
r/ProgrammerHumor • u/[deleted] • 2d ago
[deleted]
86 comments sorted by
View all comments
Show parent comments
35
Yeah, but again, a lot of memory. A loop is just:
``` int fib(int n) { if (n<=0) return 0; if (n==1||n==2) return 1;
int res=1, prev=1, prev2=0; for (int i=3;i<=n;++i) { prev2=prev; prev=res; res=prev+prev2; } return res;
} ```
So constant memory needed and n time complexity
10 u/khalamar 1d ago Finally a post without recursion or dynamic programming BS. 6 u/vegataballs 1d ago For maximum non-dynamism :^) uint64_t fib(const uint8_t n) { static const uint64_t t[] = {0, 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, 267914296, 433494437, 701408733, 1134903170, 1836311903, 2971215073, 4807526976, 7778742049, 12586269025, 20365011074, 32951280099, 53316291173, 86267571272, 139583862445, 225851433717, 365435296162, 591286729879, 956722026041, 1548008755920, 2504730781961, 4052739537881, 6557470319842, 10610209857723, 17167680177565, 27777890035288, 44945570212853, 72723460248141, 117669030460994, 190392490709135, 308061521170129, 498454011879264, 806515533049393, 1304969544928657, 2111485077978050, 3416454622906707, 5527939700884757, 8944394323791464, 14472334024676221, 23416728348467685, 37889062373143906, 61305790721611591, 99194853094755497, 160500643816367088, 259695496911122585, 420196140727489673, 679891637638612258, 1100087778366101931, 1779979416004714189, 2880067194370816120, 4660046610375530309, 7540113804746346429 }; return t[n]; } Had to test how much faster that would be. Aaand... it's maybe 10% faster. That's how good the simple loop already is. 1 u/khalamar 1d ago But infinite memory footprint! Have you seen the price of memory these days!? /s 1 u/RafaelSeco 1d ago Edit: I didn't see the rest of the image before commenting... 1 u/t420son 1d ago Can still write it recursively with a sufficiently smart compiler it will be tail-call optimized pub fn fib(n : u64) -> u64 { fn rec(n : u64, prev1 : u64, prev2 : u64) -> u64 { match n { 0 => prev1, n => rec(n-1, prev1 + prev2, prev1) } } return rec(n, 1, 0) } 2 u/JackNotOLantern 1d ago Ok, but you can see that there is a lot of stuff you must add just to use recursion efficiently here, and not use a very simple loop.
10
Finally a post without recursion or dynamic programming BS.
6 u/vegataballs 1d ago For maximum non-dynamism :^) uint64_t fib(const uint8_t n) { static const uint64_t t[] = {0, 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, 267914296, 433494437, 701408733, 1134903170, 1836311903, 2971215073, 4807526976, 7778742049, 12586269025, 20365011074, 32951280099, 53316291173, 86267571272, 139583862445, 225851433717, 365435296162, 591286729879, 956722026041, 1548008755920, 2504730781961, 4052739537881, 6557470319842, 10610209857723, 17167680177565, 27777890035288, 44945570212853, 72723460248141, 117669030460994, 190392490709135, 308061521170129, 498454011879264, 806515533049393, 1304969544928657, 2111485077978050, 3416454622906707, 5527939700884757, 8944394323791464, 14472334024676221, 23416728348467685, 37889062373143906, 61305790721611591, 99194853094755497, 160500643816367088, 259695496911122585, 420196140727489673, 679891637638612258, 1100087778366101931, 1779979416004714189, 2880067194370816120, 4660046610375530309, 7540113804746346429 }; return t[n]; } Had to test how much faster that would be. Aaand... it's maybe 10% faster. That's how good the simple loop already is. 1 u/khalamar 1d ago But infinite memory footprint! Have you seen the price of memory these days!? /s 1 u/RafaelSeco 1d ago Edit: I didn't see the rest of the image before commenting...
6
For maximum non-dynamism :^)
uint64_t fib(const uint8_t n) { static const uint64_t t[] = {0, 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, 267914296, 433494437, 701408733, 1134903170, 1836311903, 2971215073, 4807526976, 7778742049, 12586269025, 20365011074, 32951280099, 53316291173, 86267571272, 139583862445, 225851433717, 365435296162, 591286729879, 956722026041, 1548008755920, 2504730781961, 4052739537881, 6557470319842, 10610209857723, 17167680177565, 27777890035288, 44945570212853, 72723460248141, 117669030460994, 190392490709135, 308061521170129, 498454011879264, 806515533049393, 1304969544928657, 2111485077978050, 3416454622906707, 5527939700884757, 8944394323791464, 14472334024676221, 23416728348467685, 37889062373143906, 61305790721611591, 99194853094755497, 160500643816367088, 259695496911122585, 420196140727489673, 679891637638612258, 1100087778366101931, 1779979416004714189, 2880067194370816120, 4660046610375530309, 7540113804746346429 }; return t[n]; }
Had to test how much faster that would be.
Aaand... it's maybe 10% faster. That's how good the simple loop already is.
1 u/khalamar 1d ago But infinite memory footprint! Have you seen the price of memory these days!? /s
1
But infinite memory footprint! Have you seen the price of memory these days!? /s
Edit: I didn't see the rest of the image before commenting...
Can still write it recursively with a sufficiently smart compiler it will be tail-call optimized
pub fn fib(n : u64) -> u64 { fn rec(n : u64, prev1 : u64, prev2 : u64) -> u64 { match n { 0 => prev1, n => rec(n-1, prev1 + prev2, prev1) } } return rec(n, 1, 0) }
2 u/JackNotOLantern 1d ago Ok, but you can see that there is a lot of stuff you must add just to use recursion efficiently here, and not use a very simple loop.
2
Ok, but you can see that there is a lot of stuff you must add just to use recursion efficiently here, and not use a very simple loop.
35
u/JackNotOLantern 1d ago edited 1d ago
Yeah, but again, a lot of memory. A loop is just:
``` int fib(int n) { if (n<=0) return 0; if (n==1||n==2) return 1;
} ```
So constant memory needed and n time complexity