跳过递归

时间:2013-09-16 17:11:06

标签: recursion

第一行是数字,int x。以下m行包含字母。在m行之后,你读入一个数字,直到。

目标是从每行的1个字母的递归中找到soluiton数字int y。

问题表明,有一个更快的解决方案,可以避免通过每个可能的密码。这就是我的问题所在。如何才能做到这一点?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:-1)

这并不复杂。您可以计算m行中的字母数。然后计算每行字母的值,该值指定跳过多少可能的解决方案,如果跳过参考行中的一个字母。可视化:

abc -> 3 letters
xy -> 2 letters
dmnr -> 4 letters

如果你从第n个字母跳到“abc”行中的第n + 1个字母,你跳过尽可能多的可能解决方案,因为每个后续行的长度的乘积都说明了。所以你跳过2 * 4解决方案 - > 8 solutions

为xy重复此步骤 - > 4 solutions已跳过。

最后一行跳过alwasy 1 solution,因为它本身就是递归路径。

所以现在你知道,如果你跳过一些特定的字母,你会跳过多少解决方案。最后一件事很简单。从1开始,将每行的计算值加到数字上,直到达到r为止。

表示在c ++中:

int v = 1, r=10;
int i1=0, i2=0, i3=0;

while (v<=r-8) {
  i1++;
  v+=8;
}
while (v<=r-4) {
  i2++;
  v+=4;
}
while (v<=r-1) {
  i3++;
  v++;
}

现在i1是你需要在“abc”行中使用的字母索引,i2是“xy”中字母的索引,而“dmnr”中的i3是所有。该算法应以i1 = 1,i2 = 0,i3 = 1 - >结束; “b”+“x”+“m”

我希望这会有所帮助。它删除了递归,但这没问题,是吗? ;)