contenido
Conduce la secuencia de Fibonacci
La secuencia de Fibonacci se usa mucho y no se incluirá aquí.
Implementación de código de lenguaje C - recursividad
Al mismo tiempo, hay muchos tipos de métodos de implementación de código, aquí están solo los métodos de implementación en lenguaje C:
La idea central es usar "recursividad".
//C语言:递归实现 Fibonacci数列
//输入n,求 Fibonacci[n] (在数学中,常常写作Fibonacci(n) )
#include <stdio.h>
#define N 100
long Fibonacci(int n);
int main(){
int n;
long k;
printf("请输入n:");
scanf("%d",&n);
k=Fibonacci(n);
putchar('\n');
printf("Fibonacci(%d)=%ld\n",n,k);
return 0;
}
long Fibonacci(int n){
if(n==1||n==2)
{
return 1;
}
else{
return Fibonacci(n-1)+Fibonacci(n-2);
}
}
Algunas pruebas:
En el siguiente ejemplo, cuando los datos son demasiado grandes, debe ocurrir un error: debido a problemas de precisión, problemas de rango de representación.
Solución positiva: Fibonacci(50) = 12 586 269 025
y preste atención al tiempo que se muestra a continuación, que también es muy largo.
Mirando el libro de texto, se puede ver que long int
el rango de representación es:
-2 147 483 648 ~ 2 147 483 647
(10 dígitos). Y el resultado de Fibonacci (50) anterior es de 11 dígitos, ¡por supuesto que saldrá mal!
Además, el siguiente resultado es incorrecto:
también debido a problemas de rango de representación.
Solución correcta: Fibonacci(49) = 7 778 742 049
Probemos 正确
los resultados a continuación: ↓ ↓ ↓
En la prueba local, el elemento 46, Fibonacci(46), debe ser el valor máximo que long int puede probar.
Tomó 8.822 segundos.
Implementación de código de lenguaje C - no recursivo
//非递归实现Fibonacci数列
#include <stdio.h>
long Fibonacci(int n);
int main(){
int n;
long k;
printf("请输入n:");
scanf("%d",&n);
k=Fibonacci(n);
putchar('\n');
printf("Fibonacci(%d)=%ld\n",n,k);
return 0;
}
//非递归实现Fibonacci数列
long Fibonacci(int n)
{
int n1=1,n2=1;
int t=0,i=0;
if (n<3)
{
//即如果n为1或者2的话,那么Fibonacci(1) = Fibonacci(2)=1
return 1;
}
else //下面举个例子,便于理解:
{
//例如n为6,我们知道Fibonacci数列为:1、1、2、3、5、8...
//此时对于下面for循环,则i=0,i<4。开始时n1和n2都是1,即第一和第二项
for(i=0; i<n-2; i++)
{
t = n1 + n2; //t就是数列第三项,为 1+1=2
n1 = n2; //注意:令n2赋值给n1,即n1和n2分别 后移一位,这时新的n1即第二项F(2)=1
n2 = t; //这里同理,t作为新的n2,即F(3)=2
//依次类推,即可实现求每一项,然后得到 Fibonacci(6),即 Fibonacci(n)
}//注意:如果还不好理解,那么动笔写一下就会理解啦!
return t;
}
}
Creo que he escrito claramente los comentarios, si no lo entiendes fíjate en la siguiente imagen, se debe entender bien:
Luego hay algunas pruebas:
resulta que los resultados anteriores son correctos.
(Además, para los primeros 100 elementos de la secuencia de Fibonacci, la subiré a " 资源
" en formato txt, que se puede descargar directamente).
En cuanto a cuál elegir, se recomienda que los principiantes utilicen el método recursivo, que es más fácil de entender.