[Lenguaje C] Secuencia de Fibonacci (secuencia de Fibonacci) implementación recursiva e implementación no recursiva

Conduce la secuencia de Fibonacci

La secuencia de Fibonacci se usa mucho y no se incluirá aquí.

inserte la descripción de la imagen 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:

inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí

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.
inserte la descripción de la imagen aquí

Mirando el libro de texto, se puede ver que long intel 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
inserte la descripción de la imagen aquí
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.
inserte la descripción de la imagen aquí

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:
inserte la descripción de la imagen aquí

Luego hay algunas pruebas:
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
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.

Supongo que te gusta

Origin blog.csdn.net/qq_44731019/article/details/123613913
Recomendado
Clasificación