【问题标题】:add numbers with recursive functions使用递归函数添加数字
【发布时间】:2013-11-15 10:53:50
【问题描述】:

我正在学习 C,我想出了这个例子

     #include <stdio.h>

     int MyAdd(int);
     main ()
     {
          int i;
          int c = 0;
          c = MyAdd(5); 
          printf("%d\n", c);
     }

     int MyAdd(int a)
     {
          if(a > 0)
               return a + MyAdd(--a);
          else
               return 0;
     }

我自己运行它,我计算出 15。(5 +4+3+2+1)但是当我运行它时,我得到 10...为什么? 在第一次时,我们不会得到 5+(再次执行函数)等等吗?

【问题讨论】:

  • add_two 是什么功能?我们有main,你不打电话给add_Twointadd_two
  • 这不是嵌套的,它是递归的
  • ok 标题已编辑
  • 先递减操作。试试return a + Add_Two(a-1);

标签: c function


【解决方案1】:

在表达式中使用时,副作用运算符会做一些有趣的、意想不到的事情,因为你基本上是受编译器支配的。

在这种情况下,您的编译器会在第一个操作数之前评估 a + MyAdd(--a) 的第二个操作数。所以,在加法中使用它之前,你要先递减变量。

在任何情况下,您都不需要递减运算符。我建议将这一行改写为return a + MyAdd(a - 1);

【讨论】:

  • 不,你有 4 + (3 + (2 + (1 + (0 + (0)))))。使用您正在使用的编译器,递减和函数调用正在运行之前,a的值被确定为加法。
  • 是的,我知道,不,你不明白。我并不是说它在进行函数调用之前正在执行递减部分。那,你必须去做。我的意思是在评估a + 部分之前,它正在执行MyAdd(--a) 部分。如果你在递减之前执行函数调用,你得到的只是 (5 + (5 + (5 + (5 + ...),最终,堆栈溢出和随后的段错误。
  • 好的...我刚刚发布了一个问题,将解决方案粘贴到那里接受它! :) @JoãoMendes
  • 按要求完成。 :)
【解决方案2】:

做类似的事情:

foo(a++) or
foo(++a)

不是很安全,因为您依赖于编译器实现——这意味着如果它从左到右或从右到左读取参数。

让我们考虑第一种情况:

foo(a++)

如果编译器从左到右读取参数,结果将是调用 foo(a) 然后是 a++。 如果从右到左读取参数,结果将是调用 f(a+1)

【讨论】:

    猜你喜欢
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-17
    • 2020-03-28
    • 2019-12-07
    相关资源
    最近更新 更多