【问题标题】:Tracing Recursion in C在 C 中跟踪递归
【发布时间】:2013-03-11 04:39:01
【问题描述】:

我对递归函数和跟踪有基本的了解,但是当我尝试跟踪以下程序时出现了问题:

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

int f1(int *a, int c);

int main(void) {
    int a=2, b=3, c=4, d=5;
    a = f1(&c, f1(&b,d));
    printf("a= %d b= %d c= %d d= %d\n",a,b,c,d);

    system("pause");
    return 0;
}

int f1(int *a, int c) {
    *a = c - 2;
    c = c*2 - (*a);
    printf("a= %d c= %d\n", *a, c);
    return c - *a;
}

当我跟踪时,我收到了两个对 f、f(4,4) 和 f(3,5) 的调用。我可以正确跟踪返回值和 f 函数中的 printf 语句。但是 main 中的最终 printf 给了我 a= 4 b= 3 c= 2 d= 5 当我写出来时,我最终得到 c=4 ......即使在我对我的工作进行了两次和三次检查之后。当我调试时,我找不到主“c”的值何时发生变化,而且我当然没有在主“c”的代码中看到任何算术。

在此先感谢...我感觉有些小东西被我忽略了。

【问题讨论】:

  • 这不是递归。 f1 永远不会调用自己。
  • @JonathonReinhart 怎么会这样? a = f1(&c, f1(&b,d)) 根据定义似乎是递归的。
  • 不知道我该怎么说。这里没有没有递归。函数f1 从不调用f1。你所拥有的与temp = f1(&amp;b, d); a = f1(&amp;c, temp); 没有什么不同,只是main 调用f1 两次。

标签: c recursion console


【解决方案1】:

main()c 将在此处更改:

int f1(int *a, int c) {
    *a = c - 2; /* <-- */
    c = c*2 - (*a);
    printf("a= %d c= %d\n", *a, c);
    return c - *a;
}

在对f1 的外部调用中,您传递了一个指向c 的指针。在f1 中,当您分配*a 时,它会更新a 指向的任何内容,即c

【讨论】:

    【解决方案2】:

    试试这样:

    #include <stdio.h>
    #include <stdlib.h>
    
    int f1(int *a, int c, const char *sa);
    
    int main(void) {
        int a=2, b=3, c=4, d=5;
        a = f1(&c, f1(&b,d, "main.b"), "main.c");
        printf("a= %d b= %d c= %d d= %d\n",a,b,c,d);
    
        system("pause");
        return 0;
    }
    
    int f1(int *a, int c, const char *sa) {
      printf("%d: set %s from %d to %d\n", __LINE__, sa, *a, c - 2); 
      *a = c - 2;
      c = c*2 - (*a);
      printf("a= %d c= %d\n", *a, c); 
      return c - *a; 
    }
    

    输出

    16: set main.b from 3 to 3
    a= 3 c= 7
    16: set main.c from 4 to 2
    a= 2 c= 6
    a= 4 b= 3 c= 2 d= 5
    

    【讨论】:

      【解决方案3】:

      调用a = f1(&amp;c, f1(&amp;b,d));c的地址传递给f1(),并在该函数的第一行

      *a = c - 2;
      

      更改c 的值。 *a 指的是c 的值。

      【讨论】:

        猜你喜欢
        • 2016-04-13
        • 1970-01-01
        • 1970-01-01
        • 2022-01-23
        • 2010-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多