前言
c语言中的递归思想是难点也是重点,C程序设计语言中涉及到一些递归,自己对递归思想掌握的还是不够,把这两道例题记录下来,增强自己的理解。
正文
非递归形式的itoa和reverse代码
#include <stdio.h>
#include <string.h>
void reverse(char s[]){
int c,i,j;
for(i=0,j=strlen(s)-1;i<j;i++,j--){
c=s[i];
s[i]=s[j];
s[j]=c;
}
}
void itoa(int n,char s[]){
int i,sign;
if((sign=n)<0){
n=-n;
sign=-1;
}
i=0;
do{
s[i++]=n%10+'0';
}while((n/=10)>0);
if(sign<0)
s[i++]='-';
s[i]='\0';
reverse(s);
}
int main(void){
char s[128];
itoa(17,s);
printf("%s",s);
}
itoa函数的递归形式:
#include <stdio.h>
#include <string.h>
void itoa(int n, char s[])
{
static int i = 0;//要用static!!
static int j = 0;//递归次数
if (n < 0)
{
n = -n;
s[i++] = '-';
}
if (n / 10)
{
j++;
itoa(n / 10, s);
}
j--;
s[i++] = (n % 10 + '0');
if (j < 0)
{
s[i] = '\0';
}
}
int main(void)
{
char s[128];
itoa(17,s);
printf("%s",s);
}
注意:为了保证变量i,j在递归的过程中是在上一次的基础上改变,要用static int声明为局部变量而不是int型变量。
有关static的用法书上这么写:
“static声明多用于变量中,也可以声明在函数,用于函数时除该函数名所在文件可见外,其他文件不可见。用于声明内部变量,如自动变量一样,是某个特定函数的局部变量,只能在该函数中使用,但与自动变量那样,随着所在函数的被调用和退出而存在和消失。换句话说,static类型的内部变量是一种只能在某个特定函数中使用但一直占据存储空间的变量。”
reverse函数的递归形式:
void reverse(char s[])
{
int c;
static i,j;
i=j=strlen(s)-1;//因为递归总是先返回最后调用的
c=s[i];
s[i]=s[j];
s[j]=c;
if(j>0){
j--;
i++;
reverse(s);
}
}
int main(void){
char s[]="abc";
reverse(s);
printf("%s",s);
}
关于递归我的思路:
- 需要先找到递归的部分。
- 设置递归的条件
- 判断回推的正确性