【问题标题】:Using while loop vs if statement to reverse a string using recursion explanation使用 while 循环 vs if 语句使用递归解释来反转字符串
【发布时间】:2020-11-03 12:52:57
【问题描述】:

所以我无法理解在这个程序中使用 if 语句来反转字符串的逻辑,while 循环不应该类似地执行任务,但是当你用 while((c=getchar())!='\n') 替换 if((c=getchar())!='\n') 它只打印字符串的最后一个字符。我需要帮助了解在这两种情况下这种递归的工作方式有何不同。

    #include <stdio.h>
void wrt_t(void);
int main(void)
{
    wrt_t();
    putchar('\n');
    return 0;
}

void wrt_t(void){
    int c;
    if((c=getchar())!='\n'){
            wrt_t();
    }
            
    putchar(c);
}

【问题讨论】:

  • 您是否尝试过用笔和纸运行逻辑?这样更容易理解。
  • 当达到\n 时,所有cs 都在等待打印,因此将在递归展开时反向打印。

标签: c string if-statement recursion while-loop


【解决方案1】:
if ((c = getchar()) != '\n') {
      wrt_t();
}

如果您使用if 语句,每次递归只会获取一个字符。如果它不是换行符 (\n),它会进入下一个最深的递归级别,并且在这个提取的级别中,尚未打印字符。

当最终到达输入中提供的换行符时,输入字符的顺序将被反向打印,因为最深(最后一个)递归级别首先打印其获取的字符,因此顺序上升到最高递归级别。

在每个更高的递归级别中,除了打印字符外,别无其他事情可做,该字符在该递归级别获取并返回到下一个最高递归级别。

结果是字符的输入,直到以相反的顺序找到第一个换行符。


while ((c = getchar()) != '\n') {
      wrt_t();
}

当您改用while 循环时,行为会有所不同。在最深递归级别最终到达换行符后,它将打印输入的最后一个字符(在最后一个递归级别获取的字符),返回到下一个最高递归级别并迭代相应的while循环,直到找到输入中的另一个换行符以跳出循环并返回到下一个最高递归级别。

如果您没有在输入中提供与递归级别一样多的换行符,则整个递归的展开将会卡住。

例如,对于像"hello" 这样的 5 个字符的输入,您需要 6 个尾随换行符才能退出递归:

hello\n\n\n\n\n\n

请注意,在这种情况下,输出将是类似的错误。当附加的换行符覆盖时,它只会打印 6 个换行符 先前存储在每个递归级别的相应 c 变量中的字符。

在您的情况下,如果它只有一个换行符,它只会打印从最深递归级别获取的输入的最后一个字符(实际上是换行符)并等待更多输入。


除此之外,如果您遇到输入错误并且getchar() 返回EOF,您将在任何递归级别中获得无限循环。

【讨论】:

  • getchar() 也可能返回 EOF 在这种情况下循环将是无限的(堆栈溢出)。
  • @AlexLop。谢谢你。将其纳入答案。
【解决方案2】:

在您的代码中,变量 c 既不是数组也不是指针,因此您不能在其中存储所有字符。

一旦 c 将一个字符存储为输入,如果再次声明它,则 新的输入将与前一个重叠

所以最后存储在变量 c 中的只是最后一个字符。

你可以这样做:

#include <stdio.h>
#include <stdlib.h>

//function declarations
int getInput();
void print_reverse_input(int i,char* str);

//global declarations
int i=0;
char c;
char str[20];
int main()
{
    int p;
    p= getInput();
    print_reverse_input(p,str);
    return 0;
}
int getInput()
{
    if((c=getchar())!='\n')
    {
        str[i]=c;
        ++i;
        getInput();
    }
    return i;
}
void print_reverse_input(int i,char* str)
{
    int j;
    for(j=i;j>=0;j--)
    printf("%c",str[j]);
}

【讨论】:

  • 我认为您误解了递归和问题所在。 c 是递归内部每个函数(调用)内部的 不同 变量。多次调用函数时不是同一个变量。任务也不是找到替代算法。这是为了解释使用while 循环而不是if 语句开始使用递归算法时递归行为的差异。这个答案是错误的,也是完全错位的。
猜你喜欢
  • 2021-06-13
  • 2015-07-06
  • 1970-01-01
  • 1970-01-01
  • 2013-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-28
相关资源
最近更新 更多