完全分割一块巧克力需要几个休息时间?

时间:2019-07-01 11:06:14

标签: scala recursion int

CodeWars再次挑战。今天我对此有疑问:

“您的任务是将给定尺寸n x m的巧克力棒切成小方块。每个方块的大小为1x1,并且不易碎。实现一个函数,该函数将返回最少的中断次数。

例如,如果为您提供大小为2 x 1的巧克力棒,则可以在一个中断中将其拆分为单个正方形,但是对于大小为3 x 1的巧克力棒,您必须进行两个中断。

如果输入数据无效,则应返回0(因为如果没有可分割的巧克力,则无需中断)。输入将始终是非负整数。”

由于某种原因,无论我提供的巧克力棒的哪一侧,输出始终为0。

我已经尝试过的:

object breakChocolate {

    var result = 0

    def breakChocolate(n: Int, m: Int) = {

        var t = n*m
        var i =0
        def breaking(y:Int): Unit ={
            if (t ==0 || t ==1)
                result = i
            else {
                breaking(t%2)
                i +=1
            }
        }
        result
    }
}

以下是测试:

  

测试结果:    测试用例    breakChocolate(5,5)应该返回24   测试失败

     

0不等于24    堆栈跟踪   38ms内完成    breakChocolate(7,4)应该返回27   测试失败

     

0不等于27    堆栈跟踪   1ms内完成   在76毫秒内完成

4 个答案:

答案 0 :(得分:4)

要解决此问题,您根本不需要递归。考虑巧克力盘子的特殊情况:(1 x n)。要完全分割此板,您需要(n-1)个中断。现在您有盘子m x n。要将其分成m个形式(1 x n),需要中断(m-1)个。因此,总中断次数为

(m-1) + m*(n-1) ~ 
m - 1 + m*n - m ~ 
m*n - 1

答案 1 :(得分:3)

如果我正确阅读了Scala,则说明基本算法有误。

这实际上是一个非常简单的问题,类似于古老的难题:如果您有55个团队参加单淘汰赛,那么显然其中一些团队必须在第一轮比赛中告别,因此不会有一个完美的均匀括号。那么总共将玩几局?

答案:54.不管支架如何制作,它都是单淘汰赛。每场比赛将剩余球队减少一队。因此,要使55名参与者减少到一名获胜者,则必须玩54场比赛。

您的巧克力棒也有类似的说法。在某个时候,您面前有p块巧克力。无论您选择打破哪一个,您都从堆中取出1并放回2,这意味着该堆现在有p + 1件。因此,对于每个拆分,您都要添加一个片段。这应该直接导致答案...

...由于在某些情况下需要返回0,这实际上可能是错误的,但是对这种情况进行特殊处理应该很容易。

答案 2 :(得分:0)

由于未运行breaking,所以得到0。

如果要使用递归,一种选择可能是使用尾部递归函数。

检查第一个减量a是否大于1,以获取“水平”中断次数以获取切片。循环时将1加到累加器。

然后通过递减b来检查它是否大于1,以获取“垂直”中断的数量。这次添加起始的“水平”值,因为这实际上是您必须分割的次数。

object breakChocolate {    
  def breakChocolate(n: Int, m: Int): Int = {
    def breaking(a: Int, b: Int, acc: Int = 0): Int = {
      if (a > 1) breaking(a - 1, b, acc + 1)
      else if (b > 1) breaking(a, b - 1, acc + n)
      else acc
    }
    breaking(n, m)
  }
}

Scala demo

答案 3 :(得分:0)

您可以改用以下代码:

  function breakChocolate(n,m) {
   if(n > 0 && m > 0) {
      return n * m - 1;
  } else {
    return 0;
  }
  }