面试碰到求斐波那契数列第 n 项

2018-12-11 21:33:18 +08:00
 oncewosiwo

前些天面试碰到一道用递归求斐波那契数列第 n 项的题目,写了个非标准答案,结果被认为做错了😓

function fb($a,$b,$n){
    $c = $a+$b;
    if($n>0){
        return fb($b,$c,--$n);
    }
    return $c;
}

$n = 10;
$ret = fb(1,1,$n-3);  //面试的时候只写了函数本身
4342 次点击
所在节点    职场话题
29 条回复
oncewosiwo
2018-12-11 22:43:38 +08:00
@trait 好的,我找时间去看看
SingeeKing
2018-12-11 23:16:07 +08:00
from fibonacci import fibo
print(fibo(10))
466730846
2018-12-11 23:45:43 +08:00
算法无误,只是在面试这个大背景下显得很弱~
emmmm 提一句,递归算法本身的可读性就比较差,这题应该是使用迭代算法吧~
zjp
2018-12-11 23:45:50 +08:00
@rabbbit 来个更冷门的...

public int Fibonacci(int n) {
if (n == 0) return 0;
if (n == 1) return 1;
boolean even = n % 2 == 0;
int k = even ? n / 2 : (n + 1) / 2;
int fib1 = Fibonacci(k);
int fib0 = Fibonacci(k - 1);
return even ? (fib1 + fib0 * 2) * fib1 : fib1 * fib1 + fib0 * fib0;
}
}
arzterk
2018-12-12 09:05:24 +08:00
还是 haskell 的直观,和伪代码没区别:
fib :: (Num a1, Num a, Eq a1) => a1 -> a
fib n
| (n == 0) = a
| (n == 1) = b
| otherwise = fib (n - 1) + fib (n - 2)
where a = 1; b = 1

更简单的写法是用 lazy infinite list :
fibs = 1 : 1 : zipWith (+) fibs (tail fibs)
取前 n 个就是
take n fibs

编译器自动 cps,速度也不慢
5yyy
2018-12-12 10:28:45 +08:00
prev = 0; curr = 1
prev , curr == curr, curr+preav
exonuclease
2018-12-12 14:52:17 +08:00
可能是想要这样的?
vector<unsigned long long> fib(int n)
{
vector<unsigned long long> vec(n);
for (int i = 0; i < n; i++)
{
if (i <= 1)
{
vec[i] = 1;
}
else
{
vec[i] = vec[i - 1] + vec[i - 2];
}
}
return std::move(vec);
}
crayygy
2018-12-12 15:28:24 +08:00
Fate810
2018-12-12 15:36:30 +08:00
function get_fb($n){
if($n==1 || $n==2){
return 1;
}
return get_fb($n-1)+get_fb($n-2);
}
echo get_fb(10);

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/516665

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX