当前位置: 首页 > 知识库问答 >
问题:

包含5倍数的布尔递归

丁书
2023-03-14

这就是我正在研究的问题:“给定一个整数数组,是否可以选择一个整数组,使得这个组和给定的目标有这些附加的约束条件:数组中所有5的倍数都必须包含在组中。如果紧接在5倍数后面的值是1,就不能选择它。(不需要循环。)”

我尝试了以下操作:

public boolean groupSum5(int start, int[] nums, int target) {
  if (start == nums.length) return (target == 0);
  if (groupSum5(start + 1, nums, target - nums[start]) && nums[start] % 5 == 0)
    return true;
  if (groupSum5(start + 1, nums, target)) return true;
  return false;
}

但它只得到5的倍数,我试过:

public boolean groupSum5(int start, int[] nums, int target) {
  if (start == nums.length) return (target == 0);
  if (groupSum5(start + 1, nums, target - nums[start]) && nums[start] % 5 == 0)
    return true;
  if (groupSum(start + 1, nums, target - nums[start])) return true;
  if (groupSum5(start + 1, nums, target)) return true;
  return false;
}

但它不起作用,因为有时5的倍数不包括在内。

我知道我的代码还没有完成第二个约束。

有什么想法吗?

共有1个答案

韩豪
2023-03-14

如果(groupSum5(start+1,nums,target-nums[start]))

对于输入中的每个数字,您需要选择是否包括它,或者不包括它。这个if是“include it”选项:这就是为什么要减少目标值的原因。

&nums[start]%5==0

...所以这意味着:不可能包含任何给定值,除非它是5的倍数。这不是问题描述要你做的!

问题描述要你做的是:如果你所在的数字是5的倍数,那么它必须包含在内。您不能选择不包含它。

因此,您将约束加在错误的if上,并且是错误的。您实际上想要的是第二个if,它包含了要修改的“letnot pick this number”:

if (!num[start] % 5 == 0 && groupSum5(start, nums, target)) return true;

换句话说:如果我们的数字不是5的倍数,那么试着不包括这个数字,看看是否可行。(因为当它是5的倍数时试图不包含它是无效的)。

如果紧接在5的倍数后面的值为1,则不得选择该值。

这是另一个约束,这个约束必须应用于第一个if(表示'lets include this number')。如果需要一些额外的&来过滤--如果您所在的数字是1,并且它不是序列中的第一个数字,并且序列中的前一个数字是5的倍数:在这种情况下,“包含该数字”不是有效的移动。

使用反向条件(前面有一个)和&&,类似于上面的示例。您想要完成的是,如果由于附加的约束而导致该步骤无效,那么“尝试包含这个数字,然后看看我们是否可以通过将该算法应用到列表的剩余部分来计算它”的步骤将被简单地跳过。

 类似资料:
  • 我怎么可能有一个递归布尔方法来检查它是否包含BAB。我有这个,但我想做它递归。

  • 我有一个数组,如果两个相邻的数被10除,它将返回true。现在它的回报总是假的。

  • 问题内容: 这是一个愚蠢的问题,但是自从我使用Java以来​​已经有很长的时间了……我该如何用布尔值编写构造函数,还是应该编写默认构造函数?我最近一直在使用C ++,但是我忘记了Java的很多语法。 这是我到目前为止所拥有的: 搜索时似乎找不到任何东西…如何初始化构造函数中的每个值?还是我应该 我也有几个继承自这个类的类,所以我不确定这是否有所作为。 问题答案: 布尔参数与其他任何类型一样。 因此

  • 问题内容: 我有一个的条目: 目前,我正在检查它是否包含真像这样: 这是检查布尔数组的 最快 方法吗?如果不是,执行此检查的最快方法是什么? 编辑: 通过在Android 4.03 Samsung S2设备上将其作为应用程序运行,我对您的答案中的方法进行了计时,如下所示: 在五次跑步中的时间排名最高,排名第一: 在5334和11584 ns之间: } return false; 在160542和1

  • 我在这个递归练习中遇到了一个问题。 练习是测试字符数组是否只有大写或小写,然后才返回true;否则,如果同时存在小写和大写字母,则返回false。 下面的代码总是返回true。 我试着在每次有大信号或小信号时都计算一个变量,然后如果数量等于数组,那么它是真的,否则它不是真的;但它没有给我这个。这是一个布尔函数,调用递归并没有给出变量的数量。 守则: