gpt4 book ai didi

functional-programming - Perl 6 - Curried 函数挂起

转载 作者:行者123 更新时间:2023-12-04 00:17:56 24 4
gpt4 key购买 nike

因此,我希望能够编写一个函数,该函数将找出您可以使用不同值(value)的硬币对特定金额进行更改的所有方式。

所以,我写了一个函数 coin它告诉你对于给定的数量,给定一个特定值(value)的硬币,你可以用多少种方法来改变这个值,以及一个函数,它将计算你可以用多少种方法来改变,对于下一个较小的硬币,使用相同类型的参数.

然后我试着写一个函数 ladder我想返回一个函数,对于@array 的硬币值将返回一个函数,该函数采用单个形式参数 $amt给定数组中指定的硬币的值,它计算您可以对该金额进行更改的方式数。

我尝试使用 &coin函数与 .assuming方法来添加硬币的值(value)并建立适当的阶梯。不幸的是,当我尝试运行结果函数时它挂起。

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,$value,&lesser) + &lesser($amt);
} else {
return &lesser($amt);
}
}

为了给出一个想法,&ladders 应该在下面的一系列函数中产生与 &twopd 等效的东西。
sub twopd($amt) { return &coin($amt,200,&onepd) };

sub onepd($amt) { return &coin($amt,100,&fifp) };

sub fifp($amt) { return &coin($amt,50,&twep) };

sub twep($amt) { return &coin($amt,20,&tenp) };

sub tenp($amt) { return &coin($amt,10,&fivp) };

sub fivp($amt) { return &coin($amt,5,&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 添加一些缓存可能是个好主意因为对于较大的值,它将多次使用相同的参数调用。

    sub ladder ( +@ ($initial, *@values) ) {
    my &base = -> $ { $initial };
    for @values {
    &base = &coin.assuming: *, $_, &base<>;
    }
    return &base;
    }

    use experimental :cached;

    sub coin ( $amt, $value, &lesser ) is cached {
    if $amt >= $value {
    coin( $amt - $value, $value, &lesser ) + lesser($amt);
    } else {
    lesser( $amt );
    }
    }

    关于functional-programming - Perl 6 - Curried 函数挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49375773/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com