解决此识别功能?

时间:2018-06-26 06:33:13

标签: c function

  

考虑以下C函数定义

int Trial (int a, int b, int c)
{
    if ((a>=b) && (c< b)) return b;

    else if (a>=b) return Trial(a, c, b);

    else return Trial(b, a, c);
}
     

功能试用:

     

a)查找a的最大值   ,b   和c

     

b)查找a的最小值   ,b   和c

     

c)查找a的中间数   ,b   ,c

     

d)以上都不是

================================================ ======================

我的看法-我取a = 1 b = 2 c = 3并得到2的答案,这是中间元素,但是那是错误的答案,正确的答案是(d)选项

那么,我要去哪里错了?

3 个答案:

答案 0 :(得分:4)

在a = b = c的情况下,此函数将由于无限递归而导致堆栈溢出,例如:((1,1,1)。考虑到所有边缘情况对于像这样的MCQ解决方案都是必不可少的。

答案 1 :(得分:1)

在C11之前,对于a,b和c都相等的情况,代码的行为是 undefined 。 (所有其他情况都可以使用调试器或老式的笔和纸分析来轻松检查。)

这是因为在这种情况下,代码将自己称为ad inititum。直到但不包括C11,在C中都没有定义没有输入或输出的无限循环。

在我看来,在这种情况下,为定义此内容而添加到C11的多余子句会增加额外的混乱。参见Is while(1); undefined behavior in C?

我相信编译器可以(理论上)优化程序以进行 tail递归;因此,例如,避免了围绕堆栈溢出的任何实现问题。如果将程序重铸到

,它可以很简单地做到这一点。
int Trial (int a, int b, int c)
{
    if (a >= b && c < b) return b;
    return Trial(a >= b ? a : b, a >= b ? c : a, a >= b ? b : c);
}

答案 2 :(得分:1)

此代码将为跟随a,b,c值提供StackOverflowError (1,2,1),(1,1,2),(2,1,1),(2,2,2) 对于上述模式中的任何数字,例如(1,2,1)a == c以及b> a和b> c,这将引发错误。

正如您提到的输入1,2,3,您将获得值2作为输出。因此,选项A“最大”和B“最小”是错误的。 选项3似乎对输入是正确的,但是代码不适用于上述输入模式。因此,正确的答案应该是上述选项“ D”中的“ N”。