C语言函数递归——斐波那契数列,兔子生崽,汉诺塔,青蛙跳台阶...

目录

1.什么是函数递归

2.函数递归的约束条件

3.函数递归的有关题

        3.1 斐波那契数列

        1.递归版

        2.非递归版

        3.2 兔子生崽

        3.3 小青蛙跳台阶

        3.4 汉诺塔  

​编辑​编辑


1.什么是函数递归

        函数递归,就是函数调用自己。

2.函数递归的约束条件

        1.函数递归存在结束条件,满足该条件结束递归。

        2.函数每次递归参数就越来越靠近结束条件。

3.函数递归的有关题

        3.1 斐波那契数列

        输出第N个斐波那契数

        1.递归版

#inlcude <stdio.h>

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

int main()
{
    int num = 0;
    scanf("%d",&n);
    printf("%d",Fib(n));
    return 0;
}

        2.非递归版

#inlcude <stdio.h>

int Fib(int n)
{
   int a = 1;
    int b =1;
    int c =1;
    while(n)
    {
        c = a + b;
        a = b;
        b = c;
        n--;
    }
}

int main()
{
    int num = 0;
    scanf("%d",&n);
    printf("%d",Fib(n));
    return 0;
}

        3.2 兔子生崽

                有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?(输出前40个月即可)。这其实是一道斐波那契数列的变种练习题。

#include <stdio.h>
int Fib(int month)
{
	if (month <= 1)
		return 1;
	return Fib(month - 1) + Fib(month - 2);
}
int main()
{
	int month = 0;
    scanf("%d",&month);
	int sum =test(month);
	printf("%d", sum);
	return 0;
}

        3.3 小青蛙跳台阶

        有一只青蛙,一次可以调一层或两层台阶,输入一个数n,代表有n层台阶,请问一共有多少种跳法。

        如果第一次跳一层台阶的话,还剩(n-1)层台阶

        如果第一次跳两层台阶的话,还剩(n-2)层台阶

        我们只要将剩余的(n-1)层和(n-2)层台阶加起来,就可以得到总共的跳法。

#include <stdio.h>
int Jump(int n)
{
	if (n == 1)
		return 1;
	else if (n == 2)
		return 2;
	else
		return Jump(n - 1) + Jump(n - 2);
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int sum = Jump(n);
	printf("%d", sum);
	return 0;
}

        3.4 汉诺塔  

        汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

#incude <stdio.h>

//n 代表 有多少个盘子
//A 代表 起始位置
//B 代表 中转位置
//C 代表 终点位置

void move(char A,char B)
{
    printf("%c -> %c  ",A,B);
}

void Hanoi(int n,char A,char B,char C)
{
    if(n == 1)
    {
        move(A,C);
    }
    else
    {
        Hanoi(n-1,A,C,B);
        move(A,C);
        Hanoi(n-1,B,A,C);
    }
}

int main()
{
    int n = 0;
    scanf("%d",&n);
    Hanoi(n,'A','B','C');
    return ;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋刀鱼的滋味@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值