我很难理解为什么
#include <iostream>
using namespace std;
int fib(int x) {
if (x == 1) {
return 1;
} else {
return fib(x-1)+fib(x-2);
}
}
int main() {
cout << fib(5) << endl;
}
导致分段错误。一旦x降到1,它不应该最终返回吗?
我很难理解为什么
#include <iostream>
using namespace std;
int fib(int x) {
if (x == 1) {
return 1;
} else {
return fib(x-1)+fib(x-2);
}
}
int main() {
cout << fib(5) << endl;
}
导致分段错误。一旦x降到1,它不应该最终返回吗?
x==2
时,你会调用 fib(1)
和 fib(0)
:return fib(2-1)+fib(2-2);
考虑当评估fib(0)
时会发生什么...
原因是斐波那契数列以两个已知实体0和1开头。你的代码只检查了一个(即1)。
将你的代码改为
int fib(int x) {
if (x == 0)
return 0;
if (x == 1)
return 1;
return fib(x-1)+fib(x-2);
}
要包括0和1。
if (x <= 1) return x
。 :-) - ghostmansdif (x<2)
。 - Abhinav Gauniyal为什么不使用迭代算法?
int fib(int n)
{
int a = 1, b = 1;
for (int i = 3; i <= n; i++) {
int c = a + b;
a = b;
b = c;
}
return b;
}
根据定义,斐波那契数列的前两个数字是1和1,或者是0和1。因此,你需要处理它。
#include <iostream>
using namespace std;
int Fibonacci(int);
int main(void) {
int number;
cout << "Please enter a positive integer: ";
cin >> number;
if (number < 0)
cout << "That is not a positive integer.\n";
else
cout << number << " Fibonacci is: " << Fibonacci(number) << endl;
}
int Fibonacci(int x)
{
if (x < 2){
return x;
}
return (Fibonacci (x - 1) + Fibonacci (x - 2));
}
这是我使用递归解决斐波那契问题的方法。
#include <iostream>
using namespace std;
int fibonacci(int n){
if(n<=0)
return 0;
else if(n==1 || n==2)
return 1;
else
return (fibonacci(n-1)+fibonacci(n-2));
}
int main() {
cout << fibonacci(8);
return 0;
}
我认为这个解决方案简洁而美观:
long long fib(int n){
return n<=2?1:fib(n-1)+fib(n-2);
}
编辑:正如jweyrich所提到的,真正的递归函数应该是:
long long fib(int n){
return n<2?n:fib(n-1)+fib(n-2);
}
(因为 fib(0) = 0。但根据上述递归公式,fib(0) 应该是 1)
要理解递归算法,你应该在纸上画图,并且最重要的是:经常“正常思考”。
fib(0)
错误地结果为 1。这个问题可以通过使用以下代码解决: return x < 2 ? x : fibonnaci(x-1) + fibonnaci(x-2);
。在这里,专为 fib(2)
设计的额外条件只会减慢函数运行速度。 - jweyrichfib
函数在fib(0)
上返回了错误的结果。请忽略其余部分 :-) - jweyrichint fib(int n) {
if (n == 1 || n == 2) {
return 1;
} else {
return fib(n - 1) + fib(n - 2);
}
}
在斐波那契数列中,前两个数字始终为1,然后每次值变为1或2时,必须返回1。
int fib(int x)
{
if (x == 0)
return 0;
else if (x == 1 || x == 2)
return 1;
else
return (fib(x - 1) + fib(x - 2));
}
int fib(int x)
{
if (x < 2)
return x;
else
return (fib(x - 1) + fib(x - 2));
}
if(n==1 || n==0){
return n;
}else{
return fib(n-1) + fib(n-2);
}
然而,使用递归获取斐波那契数列并不是一个好的实践,因为函数被调用的次数约为接收到的数字的8.5倍。例如,要获取第30个斐波那契数(1346269)- 函数将被调用7049122次!