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

javascript变更算法

满增
2023-03-14

我正在用javascript解决“进行更改”的问题:

问题:

给定一定数量的货币,一组硬币面额,计算使用可用面额的硬币制造货币的方法的数量。

例子:

对于金额=4(4),面额=[1,2,3](1,2,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);

问题:

  1. 有人能给我解释一下发生了什么事吗?我试图遵循代码,但在递归之间迷失了方向

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

有人能理解这个算法吗?

对不起,刚开始学习动态编程。

谢谢你,

共有1个答案

谷梁襦宗
2023-03-14

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

函数更改器得到定义,然后第一次调用。

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

由于变量index不是0,我们转到循环。

使用索引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.)

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

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

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

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

总数计数3

 类似资料:
  • 一个典型的变革问题,但有点扭曲。给定一个大的金额和面额,我需要想出总数的方式,其中金额可以使用RECURSION。函数的签名如下 总数 面额-可用面额。

  • 给定目标金额和硬币面额列表,我的代码应该找到达到目标金额所需的最少硬币。 示例: > 我们可以从3x253x1做78,所以需要6个硬币 48=2x24,因此2枚硬币就足够了 我们可以从2x161x3中得到35,所以3个硬币就足够了 我用for循环编写了代码,但如何使其递归?

  • 问题内容: 当用户编辑with 属性的内容时,我想运行一个函数。什么相当于一个事件? 我使用的是jQuery,因此首选使用jQuery的解决方案。谢谢! 问题答案: 我建议将侦听器附加到由editable元素触发的关键事件上,尽​​管您需要注意,并且在更改内容本身之前会触发事件。这不会涵盖更改内容的所有可能方法:用户还可以从“编辑”或上下文浏览器菜单中使用剪切,复制和粘贴,因此您可能也想处理 和事

  • 我想做一个递归算法来解决做出改变的问题。是否可以使用非动态方法,不仅返回最小数量的硬币,还返回用于构成给定值的硬币集, 例如,给定值6和硬币组=[1,3,4]。有没有可能创建一个不记忆的递归算法,可以返回最小数量的硬币(2)和硬币集(3,3)? 编辑:这是我当前的算法,但它只返回硬币总数: 将返回3,但我希望它也提供集合{5,5,1}。第二个参数(2)是硬币的数量减去1。

  • 此处所选项目应为项目1、项目4、项目5和项目6(60+60+80+40=240公斤) 实施例2:-袋最多可容纳180公斤的重量 项目1-60公斤、项目2-30公斤、项目3-55公斤、项目4-30公斤、项目5-70公斤、项目6-48公斤

  • 你可以通过声明int,float,char和double类型的变量,来对它们做更多的事情,让我们来熟悉它们吧。接下来我们会在各种数学表达式中使用它们,所以我会向你介绍C的基本算术操作。 int main(int argc, char *argv[]) { int bugs = 100; double bug_rate = 1.2; printf("You have %d