【问题标题】:recursive function behaviour递归函数行为
【发布时间】:2014-11-26 15:51:43
【问题描述】:

程序1:

无法打印任何内容,即使我们传递了 string s

void reverse(char *s)
{
    if(*s)
    {
        return reverse(s+1); 
        printf("%c",*s);
    }
}

程序2:

作为精确的行为,它以相反的顺序打印字符串。

void reverse(char *str)
{
    if(*str)
    {
        reverse(str+1);
        printf("%c", *str);
    }
}

有人知道吗,程序 1 会出现什么问题。
我认为,在递归函数中,我们应该在函数之前放置 return 语句。是不是一定要放return statement/necessary??.

【问题讨论】:

  • 在您的第一个程序中,您在打印之前返回。
  • 这称为“无法访问的代码”。每个现代编译器都会对此类代码发出警告。
  • 除了无法访问的代码之外,您的函数还声明了void return,因此它无论如何都无法返回值。
  • 你明白打印一个值和从一个函数返回一个值是两件完全不同的事情吗?
  • 我认为问题更多:你明白return 语句在那个时候立即退出函数吗?

标签: c function recursion


【解决方案1】:

这与递归无关。 printf 语句是死代码,其原因与

相同
int main()
{
  return 0;
  printf("hello, world");
}

不起作用。您应该收到此类代码的编译器警告。

此外,您的递归函数需要一个停止调用自身的条件,否则它将无休止地生成新函数,直到您遇到堆栈溢出。

【讨论】:

  • 有这样一个条件:if(*str)...,所以到达字符串终止符就停止了。
【解决方案2】:

在第一个程序中,有一个 return 语句退出函数而不打印任何内容。那就是函数递归地调用自己,并且在每次递归中它立即将控制权返回给调用者。控制永远不会实现打印语句。

其实函数可以改写成这样的

void reverse(char *s)
{
    if(*s)
    {
        return reverse(s+1); 
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-06
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-14
    相关资源
    最近更新 更多