K&R递归思想例题:itoa及reverse函数的实现

前言

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);
}

关于递归我的思路:

  • 需要先找到递归的部分。
  • 设置递归的条件
  • 判断回推的正确性
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值