写一个递归函数来乘以2个整数

时间:2013-11-19 20:46:18

标签: c++ recursion multiplication

这是我的家庭作业。看起来这个论坛上的人们似乎也在寻求类似功能的帮助,但我找不到足够的相关内容供我使用。

这是;

Nat multiply(Nat a, Nat b)函数采用2个Nat类型值。它们包含int theValue值和bool isValid值。第二个是无关紧要的(就我而言。)

我正试图将这两个Nat值相乘。这就是我目前所拥有的,虽然它随着我变得越来越沮丧而经常变化; [编辑] - >这是一个略有修改的版本;

    if(b.theValue == 1){
    return a;
}
else if(a.theValue == 0 || b.theValue == 0){
    a.theValue = 0;
    return a;
}
else{
    a = add(a, a);
    b = decrement(b);
    return multiply(a, b);
}

[编辑]它适用于1和0的值。我将实施你的有用提示。

限制是我不能直接使用'+'运算符,或直接使用'*'运算符,它必须是递归的。但是,我可以使用incrementdecrement函数来获取一个Nat参数,并将其增加一个。我也可以使用我自己编写的addsubtract函数,并进行了广泛的测试。

大多数情况下,我认为我有一个问题是了解如何修改这些值而不影响另一个更改的次数。即;如何在将b的SAME值添加到?时达到基本情况?我有点理解递归的概念,但这个问题让我感到不安。

正如你可能看到的,我不确定我在做什么。这个功能给我的答案是关闭的。

感谢任何帮助,并提前感谢。

[编辑] 这些都有帮助,我越来越感谢哈哈了。

[编辑] 我有一位老师帮忙,他指出了看似明显的解决方案。在没有更改标题的情况下,以防其他人来搜索;

    if(b.theValue == 1){
    return a;
}
else if(a.theValue == 0 || b.theValue == 0){
    a.theValue = 0;
    return a;
}
else{

    //a = add(a, a);
    b = decrement(b);

    return add(a , multiply(a, b));
}

我正在跳过与递归相关的一些基本思维过程。这对我来说现在很有意义。再次感谢你们。

2 个答案:

答案 0 :(得分:2)

您应该通过简单的乘法手动逐步完成此操作,例如2 * 1 ......您可能会发现问题出现在a = add(a, b);中。 a*b a+a+a+a+…b,直到您a总共b为止。您的例程正在添加b,只应 递减a = add(a, original_a);(这实际上是一个加法计数器)。

要将其设置为递归例程,您实际上需要第三个参数...存储要添加的值的内容,因此original_a - Nat multiply(Nat a, Nat b) { if (a.theValue == 0) return a; if (b.theValue == 0) return b; return recursive_multiply(a, b, a); } Nat recursive_multiply(Nat a, Nat b, Nat adder) { if (b.theValue == 0) return a; a = add(a, adder); b = decrement(b); return recursive_multiply(a, b, adder); } 不应该在整个行动中进行修改。

{{1}}

答案 1 :(得分:0)

我认为我和你在同一个班级,如果是这样,我有一些非常重要的事情要提到,这将至关重要地改变你的整个答案。在函数中它提到了这个:

  

//您可能无法直接访问Nats中的字段

这意味着你不能在这个问题中使用a.theValue或b.theValue。如果你这样做,你将在该功能上获得0分。为了确认你有我的作业你有没有机会有一个名为bool zero(Nat n)的函数?如果是这样,你必须使用其他函数,如递增,递减和NotANat。

这些是你应该在添加,乘法和减法时使用的函数:

// given an integer, create a Nat
// This is the only way you should create Nats!
bool NotANat(Nat n)
{
    return !(n.isValid);
}

// given a Nat, check if it is zero or not
bool zero(Nat n)
{
    if (n.isValid) {
        return n.theValue == 0;
    }
    else
    {
        return false;
    }
}

// given a Nat, returns a Nat one less
// Note: we cannot allow this function to produce a negative value
// so to avoid that, we'll set the invalid flag

Nat decrement(Nat n)
{
    if (n.isValid && n.theValue > 0)
    {
        n.theValue = n.theValue - 1;
    }
    else
    {
        n.isValid = false;
    }
    return n;
}

// given a Nat, returns a Nat one greater
Nat increment(Nat n)
{
    if (n.isValid) {
        n.theValue = n.theValue + 1;
    }
    return n;
}

由于我在课堂上,由于学术诚实而无法讨论答案,但我可以告诉你你能做些什么。在大多数情况下,你有正确的问题,但你的基本案例陈述应该使用零函数。

编辑: 由于完成任务,我现在可以给出答案。这是我的任务,我多次测试它的工作原理:

// ToDo: add()
//       given 2 Nats a,b, return a Nat that represents the sum a+b
//       you may not use + directly
//       you may not access the fields in the Nats directly
//       you must use recursion!
//       you may use any functions already defined for Nat

Nat add(Nat a, Nat b)
{
    if (zero(b)){
        return a;
    } else {
            return add(increment(a), decrement(b));
    }
}


// ToDo: multiply()
//       given 2 Nats a,b, return a Nat that represents the product a*b
//       you may not use * or + directly
//       you may not access the fields in the Nats directly
//       you must use recursion!
//       you may use any functions already defined for Nat
//       Hint: you should use add()

Nat multiply(Nat a, Nat b)
{
    if(zero (b)){
        return b;
    } else {
        return add(a, multiply(a, decrement(b)));
    }
}


// ToDo: subtract()
//       given 2 Nats a,b, return a Nat that represents the difference a-b
//       you may not use - directly
//       you may not access the fields in the Nats directly
//       you must use recursion!
//       you may use any functions already defined for Nat

Nat subtract(Nat a, Nat b)
{
    if (zero(b)){
       if(NotANat(a){
          return a;
       }else{
          return a;
       }
    } else {
        return subtract(decrement(a), decrement(b));
    }
}

所以基本上发生的事情是我使用“bool zero(nat n)”作为所有三个函数的基本案例语句,因为这是用户可以使用的唯一原始函数,而无需直接访问函数中的字段。我们在乘法函数中返回b,因为当b为零时它将返回0,因此函数得到满足。您的示例提到如果b是1,那么它将返回a作为基本情况。在大多数情况下,这是回答它的常用方法,但正如我所提到的,你不能使用意味着函数将被标记为零的字段。因此,这是做出答案的一种方式。这个赋值的重点不是能够使用函数相乘,而是使用你的知识使原始函数工作并正确使用递归。我可能会解释这个错误,因为这是我的第一年,但如果有人愿意扩展到这一点,我将不胜感激。