【发布时间】:2019-01-21 16:44:15
【问题描述】:
这是我用最少的处理能力解决“斐波那契数列的第 n 项”的想法-
int fibo(int n, int a, int b){
return (n>0) ? fibo(n-1, b, a+b) : a;
}
main(){
printf("5th term of fibo is %d", fibo(5 - 1, 0, 1));
}
打印所有术语,直到第 n 个术语,
int fibo(int n, int a, int b){
printf("%d ", a);
return (n>0)? fibo(n-1, b, a+b): a;
}
我向我的大学教授展示了这段代码,据她说,这是解决斐波那契问题的错误方法,因为这没有抽象方法。我应该将函数称为 fibo(n) 而不是 fibo(n, 0, 1)。这对我来说不是一个满意的答案,所以我想请教 SOF 方面的专家。
与解决斐波那契问题的传统方法相比,它有自己的优势。我们使用两个并行递归来获得斐波那契的第 n 项 (fibo(n-1) + fibo(n-2)) 的技术可能会很慢,无法给出系列的第 100 项,而我的技术即使在最坏的情况下也会快得多场景。
为了抽象它,我可以使用默认参数,但 C 不是这样。虽然我可以使用类似 -
int fibo(int n){return fiboN(n - 1, 0, 1);}
int fiboN(int n, int a, int b){return (n>0)? fiboN(n-1, b, a+b) : a;}
但是将整个想法抽象出来就足够了吗?我应该如何说服其他人这种方法没有错(虽然有点模糊)?
(我知道,这不是我应该在 SOF 上问的问题,但我只是想在这里得到专家的建议。)
【问题讨论】:
-
我很困惑。既然您没有将 a 和 b 用于任何事情,为什么它们会在那里?而且这不是在所有情况下都返回零吗?
-
确实,正如@SamiKuhmonen 所说,此代码将始终返回 0。也许您的教授希望您解决这个问题而不是“抽象”问题?在我看来,“抽象”问题确实不是问题,而是更多功能,因为您可以为斐波那契计算器指定起始值。
-
你测试过你的想法了吗?它有效吗? I don't think the 5th Fibonacci number is zero 但也许我错过了什么?
-
第 5 个斐波那契数是第 4 个加第 3 个。所以试着计算第四个数字。那是第三个加上第二个。所以计算第三个......它是第二个加上第一个。我认为你走在正确的轨道上,坚持不止一个数字,但是当你调用
fibo(5,0,1)时传递的额外数字是第一个和第二个,在计算第 5 个时这些数字没有用。 -
哦,我的错。我的代码中有一个错字。它应该返回 a 而不是 0。而且或多或少,它有效。请重新检查代码。