C语言函数递归,c语言递归函数详解

C语言函数递归,c语言递归函数详解,c语言 深入理解函数的递归

本章讲解的是函数的递归,因为递归函数是解决复杂问题的最重要的方法之一,我们在学习算法的过程中会遇到他,所以我想对它做一个讲解,希望能帮助到别人,也能帮助自己整理一下。下面,我将解释一些主题来理解递归函数。

前言:

首先,什么是递归?递归是指定义一个函数,然后在函数中调用该函数。一般来说,函数调用自己。那么递归有什么好处呢?可以用少量的代码表达复杂的问题,提高了代码的可读性。

但是递归有一个条件,就是每次重复调用都需要更接近这个限制。

1.用递归打印一个整数的每一位

题目的要求是打印整数的每一位,比如1234。打印的结果是1234。我们已经学会了用循环来打印4321,但是和递归相比,用循环来打印会有点复杂。

# includes dio . h//使用递归打印整数的每一位

打印(整数)

{

int I=0;

如果(n9)

{

打印(n/10);

}

printf(“% d”,n);

}

int main()

{

int num=0;

Printf('请输入一个整数:');

scanf('%d ',编号);

打印(数字);

返回0;

}

这个问题利用了递归的思想,递归函数就是打印函数。

首先是递归中的“通”。

当我们在scanf函数中输入一个整数1234时,第一次进入打印函数,通过if语句再次进入打印函数。注意,printf还没有打印出结果。

第二次进入打印功能。这时候进入函数的数字不是1234,而是十之后除以123。进入打印函数后,通过if语句再次进入打印函数。请注意,此时printf还没有打印出结果。

第三次进入打印函数,12除以10后还是大于9,于是通过if语句再次进入打印函数,然后除以10后用1进入打印函数。请注意,此时printf还没有打印出结果。

第四次调用打印函数时,此时n为1,显然不满足大于9的条件。这时1比10多的结果还是1,所以先打印出1。

然后就是递归中的“返回”。

打印完1,第四次进入循环的过程就结束了。这时,我们回到上一个循环。我们知道最后一个循环在进入if语句后没有再往下走。当我们回去的时候,我们将继续上一个操作,运行下来,打印12次以上的结果2。同样,我们将打印最终的1234。

2.递归求n的阶乘

你还记得上一次求n的阶乘还是上一次。这次用递归求解n的阶乘其实很简单。首先,写一个求n的循环,不用递归。

# includes dio . h//求n的阶乘。

int main()

{

int num=0;int I=0;int ret=1;

Printf('请输入一个值:');

scanf('%d ',编号);

for(I=2;i=num我)

{

ret *=I;

}

printf('%d ',ret);

返回0;

}

然后递归求n的阶乘:

# includes dio . h//求n的阶乘。

整数因子(整数n)

{

如果(n ^ 1)

返回n * fac(n-1);

其他

返回1;

}

int main()

{

int ret=0;

int num=0;

Printf('请输入n的值:');

scanf('%d ',编号);

ret=fac(num);

printf('%d ',ret);

返回0;

}

这时,of的n就是输入值,fac(n-1)反复调用这个函数,可以无限接近n大于1的条件。这使用了递归的思想。我们知道求n的阶乘也可以表示为n乘以(n-1)的阶乘。重复这个过程,当n-1等于1时停止。达到求n的阶乘的目的~ ~

3.用递归和非递归求字符串的长度

求字符串的长度不是strlen函数吗?

但是不使用这个库函数呢?

我们还是可以用两种方法解决。

首先用非递归求字符串的长度,也就是用我们自己的my_strlen函数。

# includes dio . h//用非递归查找字符串的长度

my_strlen(char *arr)

{

int a=0;int ret=0;

char c=*(arra);

while(arr[a]!='\0')

{

a;

ret

}

返回ret

}

int main()

{

int ret=0;

char arr[]=' ABC ';

ret=my _ strlen(arr);

printf('%d ',ret);

返回0;

}

递归如下:

# includestdio.h

my_strlen(char* arr)

{

int I=0;

if (*arr=='\0 ')

返回0;

if (*arr!='\0')

返回1 my _ strlen(arr 1);

}

int main()

{

int ret=0;

char arr[]=' ABC ';

ret=my _ strlen(arr);

printf('%d ',ret);

返回0;

}

这个问题的思路是一个一个数字符,直到\0结束程序。我们知道“abc”由四个字符abc\0组成,递归的思想是先数字符A,再数B,直到\0结束。

4.输入一个数求各位数之和

这道题的意思是求一个百位数的整数之和,比如1234结果是10;

# includes dio . h//输入一个数字以查找数字的总和。

sum(int x)

{

int ret=0;

如果(x ^ 9)

{

返回x % 10 sum(x/10);

}

其他

返回x;

}

int main()

{

int num=0;

Printf('请输入数字的总和:');

scanf('%d ',编号);

printf('%d ',sum(num));

返回0;

}

5.用递归求n的k次方

# includes dio . h//用递归求n的k次方

tmp(int x,int y)

{

如果(y=0)

{

返回1;

}

其他

返回x * tmp(x,y-1);

}

int main()

{

int k=0;int n=0;

Printf('请输入一个n和k:');

scanf('%d %d ',n,k);

int ret=tmp(n,k);

printf('%d ',ret);

返回0;

}

6.计算斐波那契数

# includes dio . h//计算斐波那契数

费博纳(整数)

{

如果(n=3)

返回费博纳(n - 1)费博纳(n-2);

else 1;

}

int main()

{

int n=0;

Printf('请输入一个n:');

scanf('%d ',n);

int ret=Fei bona(n);

printf('%d ',ret);

返回0;

}

斐波那契数列是1 1 2 3 5 8 13.前两个数之和得到第三个数。

下面是一个没有递归的解决方案:

# includes dio . h//用非递归查找斐波那契数\

int feibona(int N)

{

int I=1;

int j=1;

int sum=I j;

for(I=4;I=N;我)

{

I=j;

j=总和;

sum=I j;

}

返回总和;

}

int main()

{

Printf('请输入一个n:');

scanf('%d ',n);

int ret=Fei bona(n);

printf('%d ',ret);

返回0;

}

结论:

这些都利用了递归函数的求解方法,思路也差不多。如果你仔细琢磨,你会发现递归的魅力。这些例子可以用来复习。欢迎支持和喜欢你的收藏~ ~

关于深入理解C语言中函数递归的这篇文章到此为止。关于C语言中函数递归的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望大家以后能多多支持我们!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • c语言调用退出函数 c语言退出整个程序怎么写
  • c语言中怎么给函数初始化 c语言的初始化语句
  • c语言编写函数计算平均值 c语言求平均函数
  • 详解c语言中的字符串数组是什么,详解c语言中的字符串数组结构,详解C语言中的字符串数组
  • 表达式求值c++实现,c语言实现表达式求值
  • 看懂c语言基本语法,C语言详解,C语言的基本语法详解
  • 用c语言实现快速排序算法,排序算法设计与实现快速排序C语言,C语言实现快速排序算法实例
  • 深入解析c语言中函数指针的定义与使用方法,深入解析c语言中函数指针的定义与使用情况,深入解析C语言中函数指针的定义与使用
  • 描述E-R图,E-R图举例,关于C语言中E-R图的详解
  • 折半查找法C语言,折半查找算法(算法设计题)
  • 折半查找法C语言,c语言折半法查找数据,C语言实现折半查找法(二分法)
  • 扫雷小游戏c++代码设计,c语言扫雷游戏源代码,C语言实现扫雷小游戏详细代码
  • 怎样统计程序代码行数,C语言统计行数,C#程序员统计自己的代码行数
  • 基于c语言的贪吃蛇游戏程序设计,用c语言编写贪吃蛇游戏程序,C语言实现简单的贪吃蛇游戏
  • 图的两种遍历算法,图的遍历算法代码c语言,Python算法之图的遍历
  • 留言与评论(共有 条评论)
       
    验证码: