【问题标题】:Recursive function divide a number递归函数除数
【发布时间】:2016-01-18 08:24:21
【问题描述】:

我需要创建一个递归函数,它可以在不使用/ 的情况下接收两个数字。

这是我写的,但它只有在除法后仍然是十进制数而不是浮点数时才有效,这就是我问的原因。

int recursive(int a, int b){
  if ( a == (0.5 * b) )
    return a;
  return recursive(a-1, b);
}

顺便说一句,该函数只能接收 1 个参数,而不是 2 个或更多:/

【问题讨论】:

  • 我知道,但如果没有人重新打开我的帖子或帮助我,我该怎么办??
  • 编辑您之前的问题,使其更清晰。我不确定我是否理解关于浮动的部分。请勿转发您的问题。
  • 基本上你想在不使用/的情况下创建一个float dividebytwo (float a)函数,对吗?
  • @BorisWainstein 你对你的问题的解释很糟糕,很难让任何人给你一个满意的答案。我真的不知道你在问什么。

标签: c recursion divide


【解决方案1】:

我认为你需要这样的东西

int divide(int a, int b){
   if(a - b <= 0){
      return 1;
   }
   else {
      return divide(a - b, b) + 1;
   }
}

【讨论】:

  • 感谢您的回答,但请仔细阅读:返回“n/2”不除且只能接收1个参数。
  • 我看到“int recursive(int a, int b)”是什么意思“他想要一个浮点数”? @泰勒
  • 我认为一种解决方案可能是找到一个在给定 n 的情况下收敛到 n/2 的系列......应该有一个,但我不记得了。
  • 当他说decimal 时,我以为他想要一个float 值,但否决票也是因为他提到他只想要one 参数。
【解决方案2】:

使用重复的减法和递归除以二。

int divide_by_two(int a) {
    if (a < 0) return -divide_by_two(-a);
    if (a < 2) return 0;
    return 1 + divide_by_two(a - 2);
}

概括,这使用重复减法和递归将a 除以b

int divide(int a, int b) {
    if (a < 0) return -divide(-a, b);
    if (b < 0) return -divide(a, -b);
    if (a < b) return 0;
    return 1 + divide(a - b, b);
}

注意,这些函数的舍入方式与 C 中定义的除法不同。

【讨论】:

    【解决方案3】:

    你可以试试这个,应该可以的:

    int dividebytwo (int a){
        static int answer = 0;
    
        if (a < 0){
            if ((answer * 2) > a){
                answer --;
                return dividebytwo (a);
            }
    
            return answer;
    
        } else if (a > 0){
            if ((answer * 2) < a){
                answer ++;
                return dividebytwo (a);
            }
    
            return answer;
        }
    
        return 0;
    }
    

    这里的技巧是使用static 属性。静态属性意味着该变量只初始化一次,并在每次函数调用后保留其值。确实,您使用了两个参数,但看起来您只使用了一个。

    此功能的唯一缺点是您只能指望它多次工作。由于这可能是一个简单的家庭作业,它可能并不重要。但实际上,这被认为是非常低效和不可靠的。

    为了补偿only-works-once 因素,可以添加以下修复之一:

    • answer声明为全局变量,并在每次函数调用之前将其设置为0

    • return answer = 0; 附加到函数的末尾,而不是return 0;。这样一来,当您想再次调用它时,您可以预先将其调用为 dividebytwo (0);

    我也不能足够强调这是一个多么奇怪的概念,它为任何进行仔细编程的人设置了各种危险信号——这可能就是你得到这么多反对票的原因。所以谨慎使用!

    【讨论】:

    • 但是每次 --/++ 静态答案都会改变,如果你不写静态它也会起作用。
    • 尝试取出static 看看会发生什么,你会得到一个堆栈溢出。所以不,如果没有static,它将无法工作。另外,我在回答中添加了一些您应该阅读的信息。
    • 制定规则的不是我 xD
    【解决方案4】:
    #include<stdio.h>
    int divide(int a, int b){
        if( a-b < 0)
          return 0;
        else if ( a-b == 0)
          return 1;
        else {
          return divide(a-b, b) + 1;
        }
      }
    

    http://codepad.org/o4CoiaON

    【讨论】:

      猜你喜欢
      • 2011-12-02
      • 1970-01-01
      • 2015-03-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-23
      • 2010-12-25
      • 2023-04-02
      相关资源
      最近更新 更多