c - 递归函数,调用后命令

标签 c string recursion

我正在阅读一份 pdf 来研究递归和字符串操作,我偶然发现了这一点。我通常了解递归函数的行为方式(仍然不是那么好),但无法弄清楚这一点。这会反转字符串。好吧,打印它相反。

void reverse(const char *const sptr);

int main()
{

char sentence[80];
printf("Enter a line of text:\n");
gets(sentence);

printf("\nThe reversed version:\n");
reverse(sentence);
puts("");


return 0;
}

void reverse(const char *const sptr)
{
    if(sptr[0] == '\0')
    {
        return;
    }
    else{
        reverse(&sptr[1]);
        putchar(sptr[0]);
    }
}

我不太明白 putchar 在这种情况下是如何工作的。谁能给我解释一下吗?我想这不仅仅是针对 putchar,当调用函数“之后”写入另一个命令行时,该函数的行为如何?

最佳答案

它与 putchar 无关,它与递归有关。

假设您给它字符串 "1234" - 或者我们称之为 ['1','2','3','4','\0'] 第一次调用反向时,调用时参数 sptr 指向 ['1','2','3','4','\0'];

执行到reverse的递归调用,这次使用偏移量1,因此参数变为['2','3','4','\0']

重复该过程,直到找到'\0',现在该函数返回到前一个调用者,打印最后一个字符,返回到前一个调用者,打印第二个最后一个字符依此类推,直到到达顶部反向调用,该调用打印第一个字符,然后存在。

也许打印一些额外的调试信息会让它更容易理解。

#include <stdio.h>

void reverse(const char *const sptr);

int recursion_level;

int main()
{
recursion_level=0;
    char sentence[80]="1234";
    // printf("Enter a line of text:\n");
    // gets(sentence);

    printf("\nThe reversed version:\n");
    reverse(sentence);
    puts("");
    return 0;
}

void reverse(const char *const sptr)
{
        recursion_level++;
        printf("reverse entered, recursion level:%d , sptr:%s \n",recursion_level, sptr);
        if(sptr[0] == '\0')
        {   recursion_level--;
            return;
        }
        else{
            reverse(&sptr[1]);
            putchar(sptr[0]);
        }
        printf("\n  reverse exits, recursion level:%d , \n",recursion_level);
        recursion_level--;
}

生成以下输出

The reversed version:                                                                                                                          
reverse entered, recursion level:1 , sptr:1234                                                                                                 
reverse entered, recursion level:2 , sptr:234                                                                                                  
reverse entered, recursion level:3 , sptr:34                                                                                                   
reverse entered, recursion level:4 , sptr:4                                                                                                    
reverse entered, recursion level:5 , sptr:                                                                                                     
4                                                                                                                                              
  reverse exits, recursion level:4 ,                                                                                                           
3                                                                                                                                              
  reverse exits, recursion level:3 ,                                                                                                           
2                                                                                                                                              
  reverse exits, recursion level:2 ,                                                                                                           
1                                                                                                                                              
  reverse exits, recursion level:1 ,  

关于c - 递归函数,调用后命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54158437/

相关文章:

c - 行seed[0] *= 16807 的作用是什么

python - python中字符串的打印长度

c - 性能缓存事件是什么意思?

无法打开输出文件,权限被拒绝错误 : Id returned 1 exit status

arrays - 从 plist 加载错误 Swift

java - 更改 Java 字符串中的日期格式

c++ - 在 vector 中推回后数字发生变化

javascript - 如何使用递归函数进行迭代(javascript)

python - 我在骑士之旅的 DFS 中缺少什么?

c - Scanf 过滤输入