javascript改变算法

Posted

技术标签:

【中文标题】javascript改变算法【英文标题】:javascript making change algorithm 【发布时间】:2017-03-19 06:21:33 【问题描述】:

我正在用javascript解决这个问题“改变”:

问题:

给定金额,一组硬币面额,计算 用可用硬币赚钱的方法数量 教派。

例子:

对于金额=4 (4¢) 和面额=[1,2,3] (1¢, 2¢ 和 3¢),你的程序会输出 4——制作方法的数量 4¢ 与这些面额:

1美分,1美分,1美分,1美分

1美分,1美分,2美分

1美分,3美分

2美分,2美分

我找到了解决办法:

var makeChange = function(total)
  var count = 0;
  var coins = [1, 2, 5, 10, 20, 50, 100, 200];

  var changer = function(index, value)

    var currentCoin = coins[index];

    if( index === 0)
      if( value % currentCoin === 0)
        count++;
      
      return;
    

    while( value >= 0 )
      changer(index-1, value);
      value -= currentCoin;
    
  
  changer(coins.length-1, total);
  return count;
;

makeChange(200);

问题:

    有人可以向我解释发生了什么吗?我尝试按照代码进行操作,但在递归之间迷失了方向。

我知道他正在计算最终的硬币价值,并从给定的总数中减去。 (但为什么?)我有点迷路了。

    当 while 循环中 value >= 0 时,它不断循环增加索引,我不明白为什么。

有人能理解这个算法吗?

抱歉,刚开始学习动态编程。

谢谢,

【问题讨论】:

"and denominations=[1,2,3][1,2,3] (11¢, 22¢ and 33¢)" - 我被困在理解那部分。如果允许的面额是 11、22 和 33,为什么要表示为 [1,2,3][1,2,3]?那应该是两个数组,还是一个二维数组,还是? @nnnnnn 谢谢。对不起,我很抱歉,这是一个错字。 (复制粘贴错误)。更新了问题。 【参考方案1】:

让我们跟踪makeChange(4) 发生了什么:

函数changer被定义然后第一次被调用。

value = 4, index = 7, coins[7] = 200

由于变量 index 不为 0,我们继续进行 while 循环。

第二次调用changer 时使用index 6

Meanwhile, the first call continues the 'while'
loop but since 200 has been subtracted from 'value',
'value' is now less than 0 so the 'while' loop terminates
and this first call does nothing more.

(Keep in mind that the variable 'value' is distinct 
and private to each call, so the 'while' loop only 
affects the 'value' in its own function call.)

好的,现在这种模式继续,所有函数调用都有index 指向大于value 的硬币,直到index 为1。

value = 4, index = 1, coins[1] = 2 

这一次更多的发生在while 循环中:

We get the function call, 'changer(0,4)', 
AND a second function call, 'changer(0,2)', 
after we subtract 2 from 'value', which was 4,
AND a third function call, 'changer(0,0)', 
after we subtract 2 from 'value', which was 2.

These 3 calls respectively represent:

   1 + 1 + 1 + 1
   2 + 1 + 1
   2 + 2

Each time the line 'value -= currentCoin' is executed,
it represents the start of another set of choices for 
solutions that include that coin.

4 % coins[0] = 0, meaning 4 is divisible by 1 represents 1 + 1 + 1 + 1

4 - 2 folllowed by 2 % 1 represents 2 + 1 + 1

and 4 - 2 - 2 represents 2 + 2

总计count3

【讨论】:

以上是关于javascript改变算法的主要内容,如果未能解决你的问题,请参考以下文章

Part1-2-3 JavaScript 性能优化

深入理解JavaScript系列(41):设计模式之模板方法

javascript基础

用 JavaScript 改变 textarea 的值

JavaScript HTML DOM——改变HTML

JavaScript DOM对象