我的循环解决方案是否为这个谜题作弊?

时间:2010-03-10 04:52:09

标签: loops puzzle

这个编程问题来自a page of Microsoft interview questions的#85。完整的问题描述和我的解决方案发布在下面,但我想先问我的问题。

规则说你可以循环固定次数。也就是说,如果'x'是一个变量,你可以根据进入循环时'x'的值循环一段代码。如果循环期间“x”发生变化,则不会改变循环次数。此外,这是循环的唯一方法。例如,在满足某些条件之前,您不能循环。

在我的问题解决方案中,我有一个循环,它将被设置为执行零次或多次。问题是,实际上它只执行0次或1次,因为我的循环中唯一的语句是return语句。因此,如果我们进入循环,它只有一次运行的机会。我使用这种策略而不是使用if-else块,因为不允许逻辑比较和if语句。规则没有明确说明你不能这样做,但我想知道你是否认为我的解决方案无效。我无法想出另一种方法。

所以这是我的问题:

  • 您认为我的解决方案无效吗?
  • 如果是这样,你有没有想过另一种解决问题的方法?

问题描述:

  

85)你有一台抽象的电脑,所以忘掉你所知道的一切   关于计算机,这个只做我要告诉你的事情   确实。您可以根据需要使用尽可能多的变量,但没有负数   数字,所有数字都是整数。你不知道的大小   整数,它们可能无限大,所以你不能指望   在任何时候截断。没有比较允许,如果没有   陈述或类似的东西。你只有四个操作   可以做变量。

     
      
  1. 您可以将变量设置为0。
  2.   
  3. 您可以设置变量=另一个变量。
  4.   
  5. 您可以增加一个变量(仅增加1),它是一个后增量。
  6.   
  7. 你可以循环。所以,如果你说循环(v1)和v1 = 10,你的循环将执行10次,但v1中的值不会改变所以   循环中的第一行可以更改v1的值而不更改   你循环的次数。
  8.         

    你需要做3件事。

         
        
    1. 编写一个递减1的函数。
    2.   
    3. 编写一个从另一个变量中减去一个变量的函数。
    4.   
    5. 编写一个将一个变量除以另一个变量的函数。
    6.   
    7. 看看你是否可以使用最多4个变量来实现所有3个变量。意思是,你现在不是在进行函数调用,而是在制作宏。并在   大多数你可以有4个变量。限制实际上只适用于   划分,其他2个很容易做到4个或更少。分部   另一方面依赖于其他2个函数,因此,如果减去   需要3个变量,然后除以1个变量保持不变   在减去召唤之后。基本上,只需要调用函数   减少和减去所以你通过引用传递你的变量,然后你   不能在函数中声明任何新变量,传入的是all   它得到了。
    8.   

我的伪代码解决方案(循环(x)意味着遍历这段代码x次):

    // returns number - 1
    int decrement(int number)
    {
        int previous = 0;
        int i = 0;

        loop(number)
        {
            previous = i;
            i++;
        }

        return previous;
    }

    // returns number1 - number2
    int subtract(int number1, int number2)
    {
        loop(number2)
        {
            number1= decrement(number1);
        }

        return number1;
    }


    //returns numerator/denominator
    divide(int numerator, int denominator)
    {
        loop(subtract(numerator+1, denominator))
        {
            return (1 + divide(subtract(numerator, denominator), denominator));
        }

        return 0;
    }

以下是您可以构建和运行的C#方法。我不得不为我做一个人为的方式 满足循环规则。

public int decrement(int num)
{
    int previous = 0;
    int LOOP = 0;

    while (LOOP < num)
    {
        previous = LOOP;
        LOOP++;
    }

    return previous;
}

public int subtract(int number1, int number2)
{
    int LOOP = 0;

    while (LOOP < number2)
    {
        number1 = decrement(number1);
        LOOP++;
    }   

    return number1;
}

public int divide(int numerator, int denominator)
{
    int LOOP = 0;

    while (LOOP < subtract(numerator+1, denominator))
    {
        return (1 + divide(subtract(numerator, denominator), denominator));
    }

    return 0;
}

1 个答案:

答案 0 :(得分:0)

好吧我认为你的答案可能无效的原因是因为你如何使用回报。事实上,我认为仅仅使用回报是一个太多的假设。在一些地方,您使用函数调用的返回值作为额外变量。现在如果return语句没问题,那么你的答案是有效的。我认为它无效的原因是因为问题暗示你需要将这些视为宏,而不是函数调用。一切都应该通过引用完成,你应该更改变量,返回值是你如何离开这些变量。这是我的解决方案:

 
int x, y, v, z;

//This function leaves x decremented by one and v equal to x
def decrement(x,v):
    v=0;
    loop(x):
        x=v;
        v++;

//this function leaves x decremented by y (x-y) and v equal to x
def subtract(x,y,v):
    loop(y):
        decrement(x,v);

//this function leaves x and z as the result of x divided by y, leaves y as is, and v as 0
//input of v and z dont matter, x should be greater than or equal to y or be 0, y should be greater than 0.
def divide(x,y,v,z):
    z=0;
    loop(x):
        //these loops give us z+1 if x is >0 or leave z alone otherwise
        loop(x):
            z++;
        decrement(x,v);
        loop(x):
            decrement(z,v)
        //restore x
        x++;
        //reduce x by y until, when x is zero z will no longer increment
        subtract(x,y,v);
    //leave x as z so x is the result
    x=z;