【发布时间】:2013-11-19 20:46:17
【问题描述】:
这是我的家庭作业。看起来好像这个论坛上的人在寻求类似功能的帮助,但我找不到足够相关的东西供我使用。
在这里;
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);
}
[EDIT] 它适用于 1 和 0 的值。我将实施您的有用提示。
限制是我不能直接使用 '+' 运算符,或直接使用 '*' 运算符,它必须是递归的。但是,我可以使用一个 increment 和 decrement 函数,它们接受一个 Nat 参数,并将其加一。我也可以使用我自己编写并经过广泛测试的add 和subtract 函数。
大多数情况下,我认为我在理解如何修改这些值而不影响另一个值的更改次数时遇到了问题。 IE;在将 b 的相同值添加到 a 时如何达到基本情况?我有点掌握递归的概念,但是这个问题困扰着我。
如您所见,我不确定自己在做什么。这个功能给我的答案是WAY。
任何帮助表示赞赏,并提前致谢。
[编辑] 这些很有帮助,我越来越近了哈哈谢谢。
[编辑] 我请了一位老师帮忙,他指出了看似显而易见的解决方案。此处无需更改标题,以防其他人来搜索;
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));
}
我跳过了一些与递归相关的基本思维过程。不过,这对我来说很有意义。再次感谢大家。
【问题讨论】:
-
@mah 是的。有什么选择吗?另外,除了零错误还有其他选择吗?第二个 if else 检查 a.theValue == 0 导致一切都为零。
-
对于初学者来说应该是:
if(b.theValue == 1){,因为 0 * 任何东西都是 0,而 1 * 任何东西都是任何东西。 0 实际上是只返回 0 的特例。 -
您能否添加另一个具有三个参数的函数(对其他人不可见,即
static)并调用它?例如:Nat multiply_helper(Nat a, Nat b, Nat original_a) {...}然后执行:Nat multiply(Nat a, Nat b) { return multiply_helper(a, b, a); } -
好吧,我通过向函数添加一个等于 a 但没有改变的参数来实现它。多谢你们。希望我还能得到满分!
-
我认为更重要的见解是(对于自然数)乘以“a * n = a + a * (n-1)”的递归定义;基本情况留作练习。
标签: c++ recursion multiplication