C 语言求指定位置的 Fibonacci 数列的值

任务:求指定位置的Fibonacci数列的值

用递归函数的程序:

#include<stdio.h>

// 斐波那契数列:1,1,2,3,5,8,13,21,...

int fib(n);

int main(void)
{
	int n = 0;
	printf("想求第几个斐波那契数列的值(输入q停止循环):");
	while (scanf("%d", &n) == 1)
	{
		printf("第%d个斐波那契数列的值是:%d\n", n, fib(n));
		printf("想求第几个斐波那契数列的值(输入q停止循环):");
	}

	return 0;
}

int fib(n)
{
	if (n <= 2)
	{
		return 1;
	}
	else
	{
		return fib(n - 1) + fib(n - 2);
	}
}

结果:

想求第几个斐波那契数列的值(输入q停止循环)11个斐波那契数列的值是:1
想求第几个斐波那契数列的值(输入q停止循环)22个斐波那契数列的值是:1
想求第几个斐波那契数列的值(输入q停止循环)66个斐波那契数列的值是:8
想求第几个斐波那契数列的值(输入q停止循环)88个斐波那契数列的值是:21
想求第几个斐波那契数列的值(输入q停止循环):q

使用循环的程序:

代码:

#include<stdio.h>

// 斐波那契数列:1,1,2,3,5,8,13,21,...

int fib(n);

int main(void)
{
	int n = 0;
	printf("想求第几个斐波那契数列的值(输入q停止循环):");
	while (scanf("%d", &n) == 1)
	{
		printf("第%d个斐波那契数列的值是:%d\n", n, fib(n));
		printf("想求第几个斐波那契数列的值(输入q停止循环):");
	}

	return 0;
}

int fib(n)
{
	int a = 1, b = 1, c = 1;
	while (n>2)
	{
		c = a + b;
		a = b;
		b = c;
		n--;
	}
	return c;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
汇编语言实现斐波那契数列可以使用递归或循环方式实现。 递归方式实现斐波那契数列: ``` section .data n equ 10 ;计算前10项斐波那契数列 section .text global _start _start: mov ecx, n ;将n存入ecx寄存器 mov eax, 0 ;将第1项斐波那契数列存入eax寄存器 mov ebx, 1 ;将第2项斐波那契数列存入ebx寄存器 call fibonacci ;调用递归函数 mov eax, 1 ;退出程序 xor ebx, ebx int 0x80 fibonacci: push ebp ;保存ebp寄存器 mov ebp, esp ;将当前栈指针存入ebp寄存器 cmp ecx, 0 ;比较n与0 je end_fibonacci ;如果n等于0,跳转到end_fibonacci标签处 cmp ecx, 1 ;比较n与1 je print ;如果n等于1,跳转到print标签处 ;计算下一项斐波那契数列 mov edx, eax ;将前一项斐波那契数列存入edx寄存器 add eax, ebx ;将前两项斐波那契数列相加,结果存入eax寄存器 mov ebx, edx ;将前一项斐波那契数列存入ebx寄存器 dec ecx ;将n减1 call fibonacci ;递归调用fibonacci函数 print: ;打印当前项斐波那契数列 push eax ;将当前项斐波那契数列存入栈中 push dword msg ;将提示信息存入栈中 call printf ;调用printf函数打印提示信息和当前项斐波那契数列 add esp, 8 ;清除栈中的参数 ;跳转到end_fibonacci标签处 jmp end_fibonacci end_fibonacci: pop ebp ;恢复ebp寄存器 ret ;返回到上一级调用函数处 section .data msg db "Fibonacci(%d) = %d", 10, 0 ;提示信息 section .text extern printf ;声明外部函数printf ``` 循环方式实现斐波那契数列: ``` section .data n equ 10 ;计算前10项斐波那契数列 section .text global _start _start: mov ecx, n ;将n存入ecx寄存器 mov eax, 0 ;将第1项斐波那契数列存入eax寄存器 mov ebx, 1 ;将第2项斐波那契数列存入ebx寄存器 call fibonacci ;调用循环函数 mov eax, 1 ;退出程序 xor ebx, ebx int 0x80 fibonacci: push ebp ;保存ebp寄存器 mov ebp, esp ;将当前栈指针存入ebp寄存器 sub esp, 4 ;为i变量分配4字节的空间 mov dword [ebp-4], 2 ;将i变量存入ebp-4的位置 mov edx, eax ;将第1项斐波那契数列存入edx寄存器 add eax, ebx ;将第2项斐波那契数列存入eax寄存器 mov ebx, edx ;将第1项斐波那契数列存入ebx寄存器 cmp ecx, 2 ;比较n与2 jle print ;如果n小于等于2,跳转到print标签处 ;循环计算斐波那契数列 loop: inc dword [ebp-4] ;将i加1 cmp ecx, dword [ebp-4] ;比较i与n jle print ;如果i大于n,跳转到print标签处 mov edx, eax ;将前一项斐波那契数列存入edx寄存器 add eax, ebx ;将前两项斐波那契数列相加,结果存入eax寄存器 mov ebx, edx ;将前一项斐波那契数列存入ebx寄存器 jmp loop ;跳转到loop标签处 print: ;打印当前项斐波那契数列 push eax ;将当前项斐波那契数列存入栈中 push dword msg ;将提示信息存入栈中 call printf ;调用printf函数打印提示信息和当前项斐波那契数列 add esp, 8 ;清除栈中的参数 ;跳转到end_fibonacci标签处 jmp end_fibonacci end_fibonacci: mov esp, ebp ;清除栈空间 pop ebp ;恢复ebp寄存器 ret ;返回到上一级调用函数处 section .data msg db "Fibonacci(%d) = %d", 10, 0 ;提示信息 section .text extern printf ;声明外部函数printf ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值