递归实现逆序输出(C)
⼀、概念
  程序调⽤⾃⾝的编程技巧称为递归( recursion)。递归做为⼀种算法在程序设计语⾔中⼴泛应⽤。 ⼀个过程或函数在其定义或说明中有直接或间接调⽤⾃⾝的⼀种⽅法,它通常把⼀个⼤型复杂的问题层层转化为⼀个与原问题相似的规模较⼩的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,⼤⼤地减少了程序的代码量。递归的能⼒在于⽤有限的语句来定义对象的⽆限集合。⼀般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满⾜时,递归前进;当边界条件满⾜时,递归返回。递归需要满⾜以下两个条件:
⼦问题须与原始问题为同样的事,且更为简单;
不能⽆限制地调⽤本⾝,须有个条件限制,结束递归调⽤
递归优缺点明显
优点: 结构清晰, 可读性强
缺点:
1. 递归是函数调⽤⾃⾝,函数调⽤是有时间和空间的消耗的:每⼀次函数调⽤,都需要在内存栈中分配空间以保存参数、返回地址以及
临时变量,⽽往栈中压⼊数据和弹出数据都需要时间。->效率
2. 递归中很多计算都是重复的,由于其本质是把⼀个问题分解成两个或者多个⼩问题,多个⼩问题存在相互重叠的部分,则存在重复计
算,如fibonacci斐波那契数列的递归实现。->效率
3. 调⽤栈可能会溢出,其实每⼀次函数调⽤会在内存栈中分配空间,⽽每个进程的栈的容量是有限的,当调⽤的层次太多时,就会超出
栈的容量,从⽽导致栈溢出。->性能
详情见:
⼆、具体解决问题
1、字符串逆序
/
*************************************************************************************************************
输⼊参数:需要逆序的字符串
功能:将输⼊的字符串逆序输出
注释:通过递归调⽤,直到指针指向⽀付串末尾‘\0’,开始输出
*******************************************************************************************************/
void recursion_char(char*c)
{
if(*c)
{
recursion_char(c+1);
printf("%c",*c);
}
}
⾸先我们先建⽴⼀个字符数组str[100],即字符串⽤于存放输⼊的字符,假如我们输⼊hello,则此时的数组名str指向的是此时的数组头部,即h(如下图)
需要逆序输出字符串, 则需将str指向最后⼀位,再往前移动输出字符, 如何将str指向最后⼀位呢? 因为输出字符长度是不固定的, 但是有⼀个共同特点, 就是都是以’\0’结尾, 所以我们只需每次将指针往后挪⼀位,这符合了我们的第⼀个条件:⼦问题须与原始问题为同样的事;
再判断其是否等于‘\0’字符即可,这也满⾜了我们的第⼆个条件,不能⽆限制地调⽤本⾝,须有个条件限制,结束递归调⽤。
所以我们每次都调⽤函数recursion_char( ),将指针str+1, 直到到尾部,再依次打印
2、整数逆序
/*************************************************************************************************************
输⼊参数:需要逆序的整数
功能:将输⼊的整数逆序输出
注释:⾸先判断此时整数变量的位数,只有⼀位直接输出,不⽌⼀位,将其最后⼀位取出输出,递归
求值。
*************************************************************************************************************/
void recursion_int(int n)
{
if(n<10)
{
printf("%d", n);
return;
}
编程递归函数printf("%d", n%10);
recursion_int(n/10);
}
整数逆序, 因为是⼗进制, 我们每次通过与10取余取出最右边⼀位, 再利⽤整形的⾃动取整功能, 除以10减去最右边⼀位。
3.例程
#include<stdio.h>
#include<stdlib.h>
/*************************************************************************************************************
输⼊参数:需要逆序的整数
功能:将输⼊的整数逆序输出
注释:⾸先判断此时整数变量的位数,只有⼀位直接输出,不⽌⼀位,将其最后⼀位取出输出,递归求值。
*************************************************************************************************************/
void recursion_int(int n)
{
if(n<10)
{
printf("%d", n);
return;
}
printf("%d", n%10);
recursion_int(n/10);
}
/*************************************************************************************************************
输⼊参数:需要逆序的字符串
功能:将输⼊的字符串逆序输出
注释:通过递归调⽤,直到指针指向⽀付串末尾‘\0’,开始输出
*******************************************************************************************************/
void recursion_char(char*c)
{
if(*c)
{
recursion_char(c+1);
printf("%c",*c);
}
}
int main()
{
int  num, cmd;
char str[100];
while(1)
{
printf("***********************************************************************************\n"); printf("请选择功能:\n");
printf("1、整数逆序  2、字符逆序    3、退出\n");
printf("***********************************************************************************\n"); scanf("%d",&cmd);
switch(cmd)
{
case1:
{
printf("请输⼊⼀个整数,以回车结束:\t");
scanf("%d",&num);
printf("整数逆序结果是:\t");
recursion_int(num);
printf("\n");
break;
}
case2:
{
printf("请输⼊⼀个字符串,以回车结束:\t");
scanf("%s", str);
printf("字符串逆序结果是:\t");
recursion_char(str);
printf("\n");
break;
}
case3:
printf("再见!\n");
exit(0);
default:
printf("输⼊有误,请重新输⼊!\n");
break;
}
}
return0;
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。