自学内容网 自学内容网

C 函数递归

目录

什么是递归

递归的限制条件

递归的例子

1、用递归求n的阶乘

递归扩展学习

1、青蛙跳台阶

思路

代码实现 

2、汉诺塔问题​

思路

代码实现

总结


什么是递归

递归:“递推” + “回归”

在C语言中,函数递归就是:函数自己调用自己

将一件事情 “大事化小”,完成这些小事所用的方法都是相同的,只是参数不一样。


递归的限制条件

  1. 递归存在限制条件,当满足这个限制条件的时候,递归便不再继续。
  2. 每次递归调用之后越来越接近这个限制条件。

递归的例子

1、用递归求n的阶乘

//VS2022 x64    
#include<stdio.h>
int Fact(int n)    //实现阶乘的函数
{
if (n == 0)       //限制条件
return 1;
else
return n * Fact(n - 1);    //递归    
}

int main()
{
int n = 0;
scanf("%d", &n);
int ret = Fact(n);       
printf("%d\n", ret);        
return 0;
}


递归扩展学习

1、青蛙跳台阶

一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。

思路

 可以发现,跳到第n个台阶,最后一步,只有两种方法:

  • 从 第 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 种跳法到第 %d 台阶", sum, n);
return 0;
}

2、汉诺塔问题​

给定三根柱子,记为 A,B,C,其中 A 柱子上有 n 个盘子,从上到下编号为 0 到 n−1 ,且上面的盘子一定比下面的盘子小。问:将 A 柱上的盘子经由 B 柱移动到 C 柱最少需要多少次?打印出每个步骤

移动时应注意:

  1. 一次只能移动一个盘子
  2. ​ 大的盘子不能压在小盘子上

思路

先从简单的三个盘子试试,可以先不看答案自己画一画,挺好玩的,注意规则噢

(1)n个盘子从A柱到C柱最少移动次数

 (2)打印出每个步骤

代码实现

#include<stdio.h>
void Move(char pos1, char pos2)//打印步骤
{
printf(" %c->%c ", pos1, pos2);
}

//pos1 起点
//pos2 中转站
//pos3 目的地
void Hannoi(int n, char pos1, char pos2, char pos3)
{
if (n == 1)
Move(pos1, pos3);
else
{
Hannoi(n - 1, pos1, pos3, pos2);//n-1个盘子借助 pow3 从 pow1->pow2
Move(pos1, pos3);//第n个盘子从 pos1 -> pos3
Hannoi(n - 1, pos2, pos1, pos3);//n-1个盘子借助 pos1 从 pos2->pos3
}
}

int main()
{
int n = 0;//需要移动的盘子数量
scanf("%d", &n);
Hannoi(n, 'A', 'B', 'C');
return 0;
}


总结

函数递归对于我这种初学者比较困难,一直在思考怎么才能把递归讲的通俗易懂,很显然,目前的我还很难做到, 对于青蛙跳台阶、特别是汉诺塔问题,我还很难熟练掌握其思想。虽然现在不太行,但我相信在日后的不断学习,绝对能够把这些知识稳稳收入囊中为我所用,所以各位也不必着急,相信自己,一定可以!



原文地址:https://blog.csdn.net/2301_82302966/article/details/138124277

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!