因此,我希望能够编写一个功能,通过使用不同值的硬币,找出可以针对特定金额进行更改的所有方法.
所以,我写了一个函数硬币,它告诉你一个给定的数量,你可以用多少种方法改变这个值,给定一个特定值的硬币,以及一个函数来计算你可以改变多少种方法,同样的类型下一个较小硬币的参数
然后我尝试编写一个函数梯,我想返回一个函数,对于@array的硬币值将返回一个函数需要一个正式的参数$amt,它计算你可以为这个量做出改变的方式的数量给定数组中指定的硬币值.
我尝试使用带有.assuming方法的& coin函数来添加硬币的值并构建适当的梯形图.不幸的是,当我尝试运行结果函数时,它会挂起.
my @values = 2,5,10,20,50,100,200; #the coin of value 1 is assumed as a base case my &test = ladder(@values); say &test(5); sub ladder(@values) { my &base = sub () { return @values.shift }; for @values { &base = &coin.assuming(*,$_,&base); } return &base; } sub coin($amt,$value,&lesser) { if $amt >= $value { return &coin($amt-$value,&lesser) + &lesser($amt); } else { return &lesser($amt); } }
为了给出一个想法,它和梯子应该在下面的一系列功能中产生相当于& twopd.
sub twopd($amt) { return &coin($amt,200,&onepd) }; sub onepd($amt) { return &coin($amt,&fifp) }; sub fifp($amt) { return &coin($amt,&twep) }; sub twep($amt) { return &coin($amt,&tenp) }; sub tenp($amt) { return &coin($amt,&fivp) }; sub fivp($amt) { return &coin($amt,&twop) }; sub twop($amt) { return &coin($amt,2,&onep) }; sub onep($amt) { return 1 };
我想知道是否有人可能知道我做错了什么.
解决方法
> sub(){return @ values.shift}每次调用时都会从@values中删除一个值,这不是你想要的.
>& coin.assuming(*,& base)需要对& base做一些事情,以便它获得& base中的当前值,而不是循环结束时剩下的内容.一种选择是添加|在它前面和另一个是使用<>去除这个价值.
>& coin.assuming(*,& base)需要对& base做一些事情,以便它获得& base中的当前值,而不是循环结束时剩下的内容.一种选择是添加|在它前面和另一个是使用<>去除这个价值.
向硬币添加一些缓存可能是一个好主意,因为对于较大的值,它会多次使用相同的参数调用.
sub ladder ( +@ ($initial,*@values) ) { my &base = -> ${ $initial }; for @values { &base = &coin.assuming: *,&base<>; } return &base; } use experimental :cached; sub coin ( $amt,&lesser ) is cached { if $amt >= $value { coin( $amt - $value,&lesser ) + lesser($amt); } else { lesser( $amt ); } }