有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

为什么这个函数返回在Java中没有返回预期的结果?

下面是一个接受int并返回int的函数。在函数中,我调用函数本身,如果I==1,我想退出函数

基本上,我试图以递归的方式计算阶乘

代码片段

static int factorial(int i){
   result = result * i;
   if(i==1){
       return 0;
   }
   factorial(i-1);
   return 1;
}

注意-结果是一个全局整型变量,初始化为1

为什么此函数返回1而不是0。 [注意,当i==1时,使用return语句,指针应该从函数中出来]

请不要发布更好的阶乘算法,我正在寻找-为什么这段代码的行为有点不同


共 (4) 个答案

  1. # 1 楼答案

    因为你没有返回0。函数将始终返回1,这是第一次调用的返回值。所有其他递归函数调用都在进行中,但父函数不用于返回。例如,如果调用factorial(5),那么所有重复调用(从4到1)都将执行并处理“result”变量,但您将只得到factorial(5)的返回值,该值始终为1

  2. # 2 楼答案

    调用factorial(3)的示例:

    int i = factorial(3);
        +--------------------------------------------------+
        |result = result * 3;                              |
        |if (i==1) {                                       |
        |  // not executed                                 |
        |}                                                 |
        |factorial(2);                                     |
        |    +-------------------------------------------+ |
        |    |result = result * 2;                       | |
        |    |if (i==1) {                                | |
        |    |  // not executed                          | |
        |    |}                                          | |
        |    |factorial(1);                              | |
        |    |    +---------------------------------+    | |
        |    |    |result = result * 1;             |    | |
        |    |    |if (i==1) {                      |    | |
        |    |    |  return 0;                      |    | |
        |    |    |// nothing more in factorial(1)  |    | |
        |    |    +---------------------------------+    | |
        |    |// factorial(1) returned 0 (value not used)| |
        |    |return 1;  // factorial(2)                 | |
        |    +-------------------------------------------+ |
        |// factorial(2) returned 1 (value not used)       |
        |return 1;  // factorial(3)                        |
        +--------------------------------------------------+
    i = 1; // the value returned by last call
    
    

    factorial(3)返回1递归被return 0终止,但该值未被使用

    如果最后两行连接到return factorial(i-1);,则返回零


    只有factorial(1)将返回0,例如int i = factorial(1)

  3. # 3 楼答案

    您的代码甚至没有编译,因为result没有定义

    然后,方法可以返回01,与您编写的return无关,因此您不能期望得到实际值


    然后是实数算法

    • 对于01,返回1
    • 否则返回值乘以factorial(previous)
    static int factorial(int i) {
        if (i <= 1) { // for 0 or 1
            return 1;
        }
        return i * factorial(i - 1);
    }
    
  4. # 4 楼答案

    您的代码的根本问题是,它对如何返回数据感到困惑

    您有一个result全局变量,它应该是这个函数如何“传递”答案的,但是它也有一个返回值。它们听起来很不一样(一个是变量,一个是语言结构),但它们在这里用于相同的目的。一半时间返回,一半时间设置result,这会导致代码产生您正在观察的效果

    解决办法是选择一方。或者只使用语句result-更新该方法,使其具有void返回值,并且不要使用return x;语句(仅return;)。或者,完全摆脱result,并使用return进行通信

    if(i==1){
              return 0;
          }
    

    将这一行与下一行进行比较:

    factorial(i-1);
    

    这一行调用factorial函数并抛出它返回的任何内容,因为您不在任何地方分配它。这就是为什么您无法观察到返回的0:因为您忽略了它

    在我看来,您似乎认为return 0;以某种方式设置了result,或者result持有“函数返回的任何内容”,但这不是真的。它们是不同的东西