C语言中的递归

时间:2013-12-17 18:53:16

标签: c recursion

#include<stdio.h>

int foo(char a[])
{
    if(a[1]=='\0')
    {
        return 0;
    }
    foo(a+1);
    foo(a+1);
    printf("%c ",a[1]);
}

int main()
{
    foo("123");
}

上述程序的输出结果如何:3 3 2 我认为输出是:3 请解释..谢谢。

2 个答案:

答案 0 :(得分:3)

这基本上是按时间顺序发生的事情:

foo(['1','2','3','\0']):
  a[1] != '\0'
  foo(['2','3','\0']):
      a[1] != '\0':
      foo('3','\0'):
          a[1] == '\0' (end)
      foo('3','\0'):
          a[1] == '\0' (end)
      print '3'
  foo(['2','3','\0']):
      a[1] != '\0':
      foo('3','\0'):
          a[1] == '\0' (end)
      foo('3','\0'):
          a[1] == '\0' (end)
      print '3'
print '2'

注意事项:

  • 递归首先进入“in”,只有当它“返回”时才会打印元素。
  • a [1]指的是第二个元素,而不是第一个元素(因为数组索引从0开始)
  • 每次递归到达printf语句时都会发生打印 - 这不止一次,只要函数没有在stop子句中结束就会发生。

答案 1 :(得分:2)

您的代码是递归的,但在调用foo(..)时,它会修改a的本地值,而不是全局值。

因此,当代码从内部foo(..)调用返回时,它会在原始字符串中输出[1],即“2”。

这就是为什么你看到3,3,然后当最后的递归返回时,2

与我的以下评论相关:

int foo(char a[])

int foo(char *a)

foo("123");

char string[] = "123";
foo(&string);

您还需要将a[1]更改为a+1