c++ - 使用 while 和 if 递归打印字符
问题描述
我是初学者,试图了解递归是如何工作的。使用 while 和 if int 代码有什么不同?为什么如果我使用“如果”它会产生正确的结果?但“虽然”没有?while(*k) ,当它到达“\ 0”时,它只打印一次,然后它又回到while循环,
非常感谢你的帮助!
#include <stdio.h>
#include <stdlib.h>
void back(char*k){
if(*k) // works
//while(*k) ->not work??
back(++k);
printf("%c",*k);
}
int main()
{
char k[]="hellomynameis";
back(k);
printf("Hello world!\n");
return 0;
}
有没有可能在 c++ 中做同样的事情但使用迭代器?
#include <iostream>
#include <string>
using namespace std;
void backk(string a){
string::iterator itr;
for (itr=a.begin();itr!=a.end();itr++){
if (*itr)
backk(++itr);
cout<<a; --> is this possible ?
//simple and fast solution
for (itr=a.end();itr!=a.begin();itr--){
if(*itr)
cout<<*itr;
}
}
}
int main()
{
string a("hello my name is");
backk(a);
cout << "Hello world!" << endl;
return 0;
}
解决方案
关于为什么while
不起作用的第一个问题,让我们看看在这种情况下代码如何运行
从一个简单的示例开始,假设我们char[]
只是GH\0
为了简单起见,嗯,它有点难以解释,但让我们
首先尝试back
调用并k
指出to G
, 因为它不是\0
,被edback
再次调用所以它指向 'H' 并且它不是这样被另一个调用, 这次是, 所以没有执行并完成它的工作, 现在执行返回到第二次调用,它是用输入调用的,但是当我们编辑它时,我们将它移到堆栈上,现在它指向k
++
\0
back
++k
\0
while
printf
back
H
++
\0
再次,所以第二次printf
运行,现在只剩下第一次back
调用,猜猜k
指向哪里?对,它指向H
(不要忘记++
),所以再次while
执行,但输入是++k
which 反过来\0
,所以新调用的back
立即返回 a printf
,我们再次处于第一次back
调用但这次指向\0
另一个printf
,我们完成,
为了更好地理解序列,我建议运行此代码
#include <stdio.h>
#include <stdlib.h>
void back(char*k)
{
printf("%c",'O');
while(*k) //->not work??
{
back(++k);
}
printf("%c",'f');
}
int main()
{
char k[]="he";
back(k);
return 0;
}
预期的输出是OOOffOff
推荐阅读
- java - 带有单词边界的 Java 模式不起作用
- java - java证书验证在不同方法上为假,但在同一类中的相同方法上为真
- python - Python中Tensorflow的角度比较损失函数
- java - Java在本地读取测试源文件,但在Bamboo服务器上读取失败
- php - 获取所有文件夹和图像并将其作为数组返回
- google-apps-script - 获取 Google 表单 ID 以进行编辑
- linux - 在 linux 下读取 UTF8 文件完全一头雾水
- r - 在数据框列表中使用reduce函数和相交(来自dplyr)来创建另一个数据框
- jquery - 检查文本区域内的变量文本
- ngx-datatable - @swimlane/ngx-datatable 虚拟滚动仅适用于缓存行