gpt4 book ai didi

recursion - 正确的 Rust 匹配习惯用法

转载 作者:行者123 更新时间:2023-11-29 08:01:37 24 4
gpt4 key购买 nike

我意识到该语言的版本为 0.9/0.10,并且仍在进行重大更改(例如本周删除 do?),但我很想知道我是否在此处使用声音惯用语。我已经实现了两种版本的变更算法,一种是朴素的,另一种在我看来看起来“更好”。

这是针对 0.9 的。这两个片段编译并在一对 assert!

中产生相同的结果
fn count_change_naive(cents: int, coins: &[int]) -> int {
if (cents == 0) {
1
} else if (cents < 0) {
0
} else {
if coins.iter().len() > 0 {
let new_amount: int = cents - coins[0];
let coins_tailed: &[int] = coins.tail();
count_change_naive(cents, coins_tailed) + count_change_naive(new_amount, coins)
} else {
0
}
}
}

在我看来,这是非常笨拙的。我尝试实现以下内容:

fn count_change_idiomatic(cents: int, coins: &[int]) -> int {
match cents {
n if cents == 0 => 1,
n if cents < 0 => 0,
n if coins.iter().len() > 0 => {
let new_amount: int = cents - coins[0];
let coins_tailed: &[int] = coins.tail();
count_change_idiomatic(cents, coins_tailed) + count_change_idiomatic(new_amount, coins)
},
_ => 0
}
}

由于匹配中的 n,我收到未使用的变量警告,但我不确定如何在没有丑陋的 if-else 金字塔的情况下避免这种情况。可以吗?我是否遗漏了第二次实现中的任何重要内容?

编辑:已经清理了一些以满足一些建议,但保持原样以供比较

最佳答案

如果没有得到你没有用的变量的警告,你就不要使用它:

fn count_change_idiomatic(cents: int, coins: &[int]) -> int {
match cents {
_ if cents == 0 => 1,
_ if cents < 0 => 0,
_ if coins.iter().len() > 0 => {
let new_amount: int = cents - coins[0];
let coins_tailed: &[int] = coins.tail();
count_change_idiomatic(cents, coins_tailed) + count_change_idiomatic(new_amount, coins)
},
_ => 0
}
}

关于recursion - 正确的 Rust 匹配习惯用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21494312/

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