从头学习c(5)

必须要培养自己读代码的能力,这很重要!!!!!!!!!!!!

在这里,我想讲一下递归代码得一些注意事项:

1.不能死递归,必须要有跳出条件,每次递归都要逼近跳出条件

2.递归层次不能太深

给当出现STACK OVERFLOW的时候,表示出现了栈溢出,我们知道,内存可以分为栈区,堆区,静态区,其中栈区是存储局部变量和函数的形参的。堆区是存储动态内存分布的一些变量,如malloc/free,calloc等,而静态区是用来存储全局变量和静态变量的,而我们在进行递归的时候,每次调用test()都会在内存的栈区进行空间的分配,当递归层次过多的话就回出现栈溢出。

习题1:编写函数不允许创建临时变量,求字符串的长度。

int my_strlen(char* str)
{
	int count = 0;
	while (*str != '\0')
	{
		count++;
		str++;
	}
	return count;
}
int main()
{
	char arr[] = "bit";
	//实现一个strlen函数
	printf("%d\n", my_strlen(arr));

	return 0;

 }

第一种方法,实现一个strlen函数,注意要用指针的方式传入,当*str找到数据不是\0的时候,进入循环即可。

int my_strlen(char* str)
{
	if (*str != '\0')
	{
		return 1 + my_strlen(str + 1);
	}
	else
	{
		return 0;
	}

}
int main()
{
	char arr[] = "bit";
	printf("%d\n", my_strlen(arr));
	return 0;
}

 第二种方法是采用了递归手段,如有不懂可结合下图理解。

 习题二://实现一个函数,打印乘法口诀表,口诀表的行数和类书自己指定如输入9,就打印9*9的口诀表

 

void print(int a)
{
	int i = 0;
	int ret = 0;
	for (i = 1; i <=a; i++)
	{
		int j = 0;
		for (j = 1; j <= i; j++)
		{
			ret = i * j;
			printf("%d*%d=%d ",i,j,ret);
		}
		printf("\n");
	}
  

}
int main()
{
	int a = 0;
	printf("请输入数字");
	scanf("%d", &a);
	print(a);

	return 0;
}

 习题3:编写一个函数,实现字符串逆序递归,即将参数字符串进行反相排列

int my_strlen(char* str)//算字符长度
{
	if (*str != '\0')
	{
		return 1 + my_strlen(str + 1);
	}
	else
	{
		return 0;
	}
}
void reverse_string(char* str)
{
	int left = 0;
	int right = my_strlen(str)-1;
	int tmp = 0;
	while (left < right)
	{
		//左边的给右边
		tmp = str[left];
		str[left] = str[right];
		str[right] = tmp;
		left++;
		right--;
	}
}
int main()
{
	char arr[] = "abcdef";
	 reverse_string(arr);
	printf("%s\n", arr);
	return 0;
}

习题4:写一个递归函数digitsum,输入一个非负整数,返回他的数字之和。如输入123,返回6

int digitsum(int x)
{
	int b = 0;
	if (x > 9)
	{
		b = x % 10;
		return b + digitsum(x / 10);
	}
	else
		return x % 10;
}
int main()
{
	int a = 0;
	printf("请输入数字");
		scanf("%d", &a);
	int ret = digitsum(a);
	printf("%d\n", ret);
	return 0;
}

习题5:/实现n的k次方,用递归实现

int pow(int x, int y)
{
	if (y != 0)
	{
		return x * pow(x, y - 1);
	}
	else if (y == 0)
	{
		return 1;
	}
	else
	{
		return 1.0 / pow(x,-y);
	}
}
int main()
{
	int n = 0;
	int k = 0;
	printf("输入数字");
	scanf("%d %d", &n, &k);
	double ret = pow(n, k);
	printf("%lf\n", ret);
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值