我正在努力帮助我的儿子解决数学问题。这似乎是让他接触某些节目的好机会。我可以看到递归解决方案,但也许迭代的解决方案更容易解释。到目前为止他学到的语言是SmallBasic,它不能很好地支持递归(没有局部变量)。我并不反对教另一种语言,但仍然想要了解是否有一种很好的方法可以在没有递归的情况下解决这个问题。
问题在于: 给定数字序列1 2 3 4 5 6 7 8 9,在数字之间插入+和 - ,使结果加起来为101.例如,1 + 23 + 4 + 5 + 67-8 + 9 = 101。
递归解决方案看起来像这样:
next(total, number, nextNumber, sequenceString)
{
//add
next(total + number, ...);
//subtract
next(total - number, ...);
//do nothing (multiply)
next(total, number * 10, ...);
}
是否有一个非常复杂的迭代解决方案?
答案 0 :(得分:17)
考虑数字之间的空格1 2 3 4 5 6 7 8 9。 有8个这样的间隙空格或插槽。
每个这样的空间可以用+, - 或任何东西填充(表示一个 正在形成更长的数字)。
这是八个插槽中每个插槽的三种可能性。将数字分配给三个可能的填充符:
0 --> +
1 --> -
2 --> (nothing)
现在每个8位三位字符串对应一个解决方案。例如:
00000000 --> 1+2+3+4+5+6+7+8+9
00000001 --> 1+2+3+4+5+6+7+8-9
00000002 --> 1+2+3+4+5+6+7+89
22222222 --> 123456789
现在编写一个简单的循环,在trinary中从00000000到22222222计数。 将上面的每个数字解释为上面的解决方案,一旦遇到产生目标的解决方案就停止,101,如果你到达终点而没有达到目标值,则报告失败。
对于类固醇有3 ^ 8(指数,不是xor或3 ** 8,或
3*3*3*3*3*3*3*3
为强烈的文字思考)可能的解决方案。那只是6561;你可以非常轻松地以这种方式强行蛮力。
答案 1 :(得分:4)
递归是计算机科学中的一个重点。如果你的目的是教你的儿子,你为什么不现在解释他的递归? ;)
答案 2 :(得分:2)
您有3个基本操作:
所以基本上你有3 ^ 8种可能的解决方案;试试这些。
这是PHP代码,但包括在其他基础上转换数字,这是一个8岁的男孩可能不会很快理解的东西。也许你可以找到扭曲:
<?php
$limit = pow(3, 8);
for($op = 0; $op < $limit; $op++){
// Get this operation.
$op_base3 = base_convert($op, 10, 3);
// Fill leading 0's.
$op_base3 = str_pad($op_base3, 8, "0", STR_PAD_LEFT);
// Here you get something like 00212120, which would say:
// 1[+]2[+]3[nothing]4[-]5[nothing]6[-]7[nothing]8[+]9
// That's: 1+2+34-56-78+9
// Compute and if result's correct, output solution.
}
?>
答案 3 :(得分:1)
当然可以通过简单的迭代来解决。您只需将字符串转换为堆栈。
答案 4 :(得分:0)
鉴于递归的深度有限,数组可以用作堆栈。
答案 5 :(得分:0)
它可以迭代完成,但不能像这样简单。更重要的是,您是否会将此作为向儿子传授算法复杂性的机会?