递归算法-DEV C++ 中return (++p)类语句

本文通过一个编程实例探讨了C++中return语句中使用p++和++p的区别。作者在编写求字符串长度的递归函数时,发现return1+strlength(p++)会导致无限循环,而return1+strlength(++p)则能得到正确结果。问题在于++p先增加指针再返回,而p++先返回再增加指针,导致前者未执行指针的更新。

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

编程内容

关于今天做作业发现,使用DEV C++对所要填写的内容进行编程时发现的return语句的问题

题目

以下函数的功能时求字符指针p指向的字符串的长度,请补充缺少的代码。

int strlength(char *p)
{
    if(*p=='\0')
	    return 0;
	    return 1+____;
}

编程中出现问题(重点)

  1. 第一次编程的内容(有问题):
#include <iostream>
using namespace std;
int strlength(char *p);
int main(void)
{
	int len;
	char arr[]="welcom";
	len=strlength(arr);
	cout<<"字符串长度为:"<<len<<endl;
}
int strlength(char *p)
{
	if(*p=='\0')
	    return 0;
	    return 1+strlength(p++);
	     
}

结果居然是:
在这里插入图片描述
于是我便开始找原因,但我总觉得问题就出在了下面这条return语句中

return 1+strlength(p++);

果不其然,于是有了下面的编程(只摘有用的来看)
2. 第二次编程内容(正确可解):

#include <iostream>
using namespace std;
int strlength(char *p);
int main(void)
{
   int len;
   char arr[]="welcom";
   len=strlength(arr);
   cout<<"字符串长度为:"<<len<<endl;
}
int strlength(char *p)
{
   if(*p=='\0')
       return 0;
       return 1+strlength(++p);
        
}

结果居然是OK的了(我是小菜鸡,若有大神造访,勿喷
在这里插入图片描述

于是我就开始纳闷为什么,上网搜索了return p++是否会执行p加1的内容,可是看的眼花缭乱,于是我加了句代码看了一遍,果然,编程思维yyds。

分析原因

两种编程的比较
(1)正确的

return 1+strlength(++p); 

在这里插入图片描述
(2)错误的

return 1+strlength(p++); 

在这里插入图片描述
这是个没有结果的编程,一直welcom。
原因:在++p时是执行了p=p+1再返回值,而p++是执行了return但没有执行p=p+1,这样就永远跳不出strlength这个函数,所以没有输出。

<think>我们正在处理的是汉诺塔问题(HanoiTower),用户要求使用C语言在Dev-C++环境中实现递归法求解5个盘子的情况。根据引用[1]中提供的代码,我们可以稍作修改,使其适用于5个盘子。注意,用户需要的是5个盘子的解决方案。汉诺塔问题的递归思想:当n=1时,直接将盘子从A移到B。当n>1时,分为三步:1.将n-1个盘子从A借助B移到C(借助递归)2.将第n个盘子(最大的那个)从A移到B3.将n-1个盘子从C借助A移到B(借助递归)引用[1]中的代码已经实现了这个递归算法,我们只需要将盘子数改为5即可。注意:用户要求5个盘子,所以我们在主函数中指定n=5,也可以保留用户输入的方式。但是用户明确要求5个盘子,我们可以写死为5,也可以按照原来的输入方式。不过用户说“实现递归法求解5个梵塔问题的解决方案”,所以我们可以直接写n=5。但是原代码中使用了scanf输入,如果我们想直接写死5,可以修改为:intn=5;不过,为了灵活性,我们可以保留输入,但在用户要求5个的情况下,我们也可以不输入,直接运行输出5个盘子的步骤。但考虑到用户要求的是5个,我们可以将代码改为直接设置n=5,同时也可以注释掉输入语句,这样每次运行都是5个盘子。然而,用户可能希望看到的是一个通用的程序,但明确要求5个盘子。我们有两种做法:1.修改程序,固定n=5,这样运行就直接输出5个盘子的步骤。2.仍然使用用户输入,但在回答中说明输入5即可。为了严格按照用户要求,我们选择固定为5个盘子,这样用户可以直接运行得到结果。另外,引用[1]中的代码函数hanoi的参数顺序是(n,a,b,c),其中a是起始座,b是目标座,c是辅助座。我们按照以下步骤修改:将main函数中的输入部分改为直接赋值n=5。注意:因为5个盘子的步骤很多(共2^5-1=31步),如果用户运行环境控制台输出有限,可能会滚动很快。但用户要求的是代码,我们提供代码即可。同时,我们也要注意,原代码中使用的字符是'a','b','c',我们按照原样输出。修改后的代码:但是,用户要求使用Dev-C++环境,所以我们需要确保代码在Dev-C++中可以编译运行。Dev-C++一般使用gcc编译器,支持C99标准,所以代码中应该注意使用标准的C语法。由于原代码已经是标准C,所以我们直接修改main函数即可。代码实现:</think> 以下是根据汉诺塔问题的递归原理实现的C语言代码,可在Dev-C++环境中直接运行。该代码针对**5个盘子**的情况输出完整的移动步骤: ```c #include <stdio.h> // 递归函数实现汉诺塔 void hanoi(int n, char source, char target, char auxiliary) { if (n == 1) { printf("%c --> %c\n", source, target); // 直接移动最后一个盘子 } else { // 1. 将n-1个盘子从源柱移动到辅助柱 hanoi(n - 1, source, auxiliary, target); // 2. 移动最底层的盘子到目标柱 printf("%c --> %c\n", source, target); // 3. 将n-1个盘子从辅助柱移到目标柱 hanoi(n - 1, auxiliary, target, source); } } int main() { int n = 5; // 指定为5个盘子 printf("汉诺塔解决方案(5个盘子):\n"); // 参数说明:盘子数量,源柱A,目标柱B,辅助柱C hanoi(n, 'A', 'B', 'C'); return 0; } ``` ### 代码说明: 1. **递归逻辑**: - 当 `n=1` 时,直接移动盘子:`A→B` - 当 `n>1` 时,分三步操作: * 将前 `n-1` 个盘子移动到辅助柱 (`hanoi(n-1, A, C, B)`) * 移动最底层盘子:`A→B` * 将辅助柱上的盘子移动到目标柱 (`hanoi(n-1, C, B, A)`) 2. **参数说明**: - `source`:当前移动的源柱(初始为A) - `target`:目标柱(初始为B) - `auxiliary`:辅助柱(初始为C) 3. **输出示例**(前5步): ``` A --> B A --> C B --> C A --> B C --> A ... ``` ### 关键特性: - 总步数:$2^5 - 1 = 31$ 步(符合汉诺塔问题规律 $2^n - 1$) - 时间复杂度:$O(2^n)$ - 空间复杂度:$O(n)$(递归栈深度) 运行此程序将完整输出5个盘子从A柱移动到B柱的全部步骤,每次移动都严格遵守"大盘不压小盘"的规则[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

XCBZBV

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

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

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

打赏作者

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

抵扣说明:

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

余额充值