strlen的模拟(递归实现)

本文介绍了如何在C语言中模拟strlen函数来计算字符串长度。首先展示了非递归方法,通过while循环查找''终止。然后探讨了递归实现方式,同样在遇到''时结束。两种方法的运行结果相同。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 在C语言中,strlen 函数是用来统计字符串的数量,遇到'\0'后就会停止计算,并把所计算的值返回。包含在头文件string.h中。
  • 简单用法如下:
    #include <stdio.h>
    #include <string.h>
    int main()
    {
    	char arr[] = { "hello world!" };
    	int ret = strlen(arr);
    	printf("%d\n",ret);
    	return 0;
    }

    当我们写一个自己的字符串计算的函数时,我们也可以参考该函数。首先用非递归来写:

  • 用一个while循环查找'\0',找不到就继续向后查找,直到找到为止。

  • 这里要用到指针运算,因为数组的名称就是数组的首地址,所以不用&即可,接着是指针的运算,arr是字符型数组,所以每次+1就是向后移动了一个字节,如果是int型,则会向后移动四个字节。arr刚开始指向的是字符‘H’,arr+1之后的地址就是字符‘E’的地址。调试结果如下:

     代码如下:

  • #include <stdio.h>
    
    int my_strlen(char* arr)
    {
    	int count = 0;
    	while (*arr != '\0')
    	{
    		count++;
    		arr++;
    	}
    	return count;
     }
    
    int main()
    {
    	char arr[] = { "hello world!" };
    	int ret = my_strlen(arr);
    	printf("%d\n",ret);
    	return 0;
    }

    运行结果如下:

     在学习过递归之后,也可以用递归来实现。递归的条件跟非递归的一样,找到‘\0’就可以终止。代码如下:

  • #include <stdio.h>
    int fac_strlen(char* arr)
     {
    
    	if (*arr != '\0')
    	{
    		return 1 + fac_strlen(arr + 1);
    	}
    	else
    		return 0;
     }
    int main()
    {
    	char arr[] = { "hello world!" };
    	int ret = fac_strlen(arr);
    	printf("%d\n",ret);
    	return 0;
    }

    结果同上。

当使用递归模拟汉诺塔游戏时,需要定义一个函数实现移动盘子的操作。下面是使用Python递归模拟汉诺塔游戏的示例代码: ```python def hanoi(n, source, target, auxiliary): if n > 0: # 将 n-1 个盘子从源柱移动到辅助柱 hanoi(n-1, source, auxiliary, target) # 将最大的盘子从源柱移动到目标柱 print(f"将盘子 {n} 从 {source} 移动到 {target}") # 将 n-1 个盘子从辅助柱移动到目标柱 hanoi(n-1, auxiliary, target, source) # 示例 n = 3 # 盘子的数量 source = "A" # 源柱 target = "C" # 目标柱 auxiliary = "B" # 辅助柱 hanoi(n, source, target, auxiliary) ``` 在上述代码中,`hanoi` 函数接受四个参数 `n`、`source`、`target` 和 `auxiliary`。其中,`n` 表示盘子的数量,`source` 表示源柱,`target` 表示目标柱,`auxiliary` 表示辅助柱。 函数内部使用递归的方式来实现汉诺塔游戏的移动操作。首先,通过递归调用 `hanoi(n-1, source, auxiliary, target)` 将 n-1 个盘子从源柱移动到辅助柱。然后,将最大的盘子从源柱移动到目标柱,并打印出移动的过程。最后,通过递归调用 `hanoi(n-1, auxiliary, target, source)` 将 n-1 个盘子从辅助柱移动到目标柱。 以上代码输出的结果为: ``` 将盘子 1 从 A 移动到 C 将盘子 2 从 A 移动到 B 将盘子 1 从 C 移动到 B 将盘子 3 从 A 移动到 C 将盘子 1 从 B 移动到 A 将盘子 2 从 B 移动到 C 将盘子 1 从 A 移动到 C ``` 这样,我们就使用递归成功模拟了汉诺塔游戏的移动过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

开拓的嚣张

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值