递归函数,如果Rust中的语句类型不匹配

乐秀
fn recursive_binary_search<T: Ord>(list: &mut [T], target: T) -> bool {
    if list.len() < 1 {
        return false;
    }
    let guess = list.len() / 2;
    if target == list[guess] {
        return true;
    } else if list[guess] > target {
        return recursive_binary_search(&mut list[0..guess], target);
    } else if list[guess] < target {
        return recursive_binary_search(&mut list[guess..list.len()], target);
    }
}

编译器抛出错误if target == list[guess]

src/main.rs:33:5: 39:6 error: mismatched types [E0308]
src/main.rs:33     if target == list[guess] {
                   ^
src/main.rs:33:5: 39:6 help: run `rustc --explain E0308` to see a detailed explanation
src/main.rs:33:5: 39:6 note: expected type `bool`
src/main.rs:33:5: 39:6 note:    found type `()`
error: aborting due to previous error

我不知道如何重写此函数以满足类型检查器。我以为是因为我将返回类型设置为bool,并且有一个返回函数调用?

谢泼玛特

dikaiosune的答案解释了问题:您的结果类型为ifis (),而不是返回的类型bool

这是一些习惯性地编写代码的几种方法:

我先用隐式返回值编写它:

fn recursive_binary_search<T: Ord + Eq>(list: &[T], target: T) -> bool {
    if list.len() < 1 {
        return false;
    }

    let guess = list.len() / 2;

    if target == list[guess] {
        true
    } else if list[guess] > target {
        recursive_binary_search(&list[0..guess], target)
    } else {
        recursive_binary_search(&list[guess..list.len()], target)
    }
}

然后,我将只执行一次比较,而不是可能执行两次。如果比较昂贵,可以节省一些时间,但是使用match

use std::cmp::Ordering;

fn recursive_binary_search<T: Ord + Eq>(list: &[T], target: T) -> bool {
    if list.is_empty() {
        return false;
    }

    let guess = list.len() / 2;

    match target.cmp(&list[guess]) {
        Ordering::Less    => recursive_binary_search(&list[..guess], target),
        Ordering::Greater => recursive_binary_search(&list[guess..], target),
        Ordering::Equal   => true,
    }
}

您还可以删除范围的开头和结尾部分,并将其is_empty用于guard子句。

然后,如果您搜索的值大于最大值,则会出现堆栈溢出的问题……在重复执行时,您需要忽略数据透视表:

use std::cmp::Ordering;

fn recursive_binary_search<T: Ord>(list: &[T], target: T) -> bool {
    if list.is_empty() {
        return false;
    }

    let guess = list.len() / 2;

    match target.cmp(&list[guess]) {
        Ordering::Less    => recursive_binary_search(&list[..guess], target),
        Ordering::Greater => recursive_binary_search(&list[guess+1..], target),
        Ordering::Equal   => true,
    }
}

fn main() {
    assert!(!recursive_binary_search(&[1,2,3,4,5], 0));
    assert!(recursive_binary_search(&[1,2,3,4,5], 1));
    assert!(recursive_binary_search(&[1,2,3,4,5], 2));
    assert!(recursive_binary_search(&[1,2,3,4,5], 3));
    assert!(recursive_binary_search(&[1,2,3,4,5], 4));
    assert!(recursive_binary_search(&[1,2,3,4,5], 5));
    assert!(!recursive_binary_search(&[1,2,3,4,5], 6));
}

如果您不是出于学习目的实现此功能,请使用内置功能binary_search

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

函数“递归返回”的“类型不匹配”

来自分类Dev

Do循环类型中的“ If”语句不匹配

来自分类Dev

类内通用递归函数的Kotlin类型不匹配

来自分类Dev

Haskell函数中的类型不匹配

来自分类Dev

Scala 中的类型不匹配(hasNext 函数)

来自分类Dev

map函数中的Scala类型不匹配

来自分类Dev

无法在Rust的递归枚举中推断泛型函数的类型

来自分类Dev

递归函数中的类型匹配和IO出现问题

来自分类Dev

高阶函数中的类型定义和类型不匹配

来自分类Dev

递归查询列中的锚点和递归部分之间的类型不匹配

来自分类Dev

递归查询“ CTE”的列“ ProductNames”中的锚点与递归部分之间的类型不匹配

来自分类Dev

递归CTE错误:类型不匹配

来自分类Dev

Fortran 95中的“错误:函数的返回类型不匹配”

来自分类Dev

flatMap函数中的Apache Flink流类型不匹配

来自分类Dev

错误:声明要返回的函数中的返回类型不匹配

来自分类Dev

Access中的DLookup函数返回类型不匹配错误

来自分类Dev

Fortran 95中的“错误:函数的返回类型不匹配”

来自分类Dev

在QTP中调用函数时类型不匹配

来自分类Dev

错误:声明要返回的函数中的返回类型不匹配

来自分类Dev

数据类型在函数调用中不匹配

来自分类Dev

使用Java的RDD函数中的类型不匹配

来自分类Dev

Rust宏与传递的类型不匹配

来自分类Dev

循环外的Rust不匹配类型错误

来自分类Dev

Excel VBA With语句返回类型不匹配

来自分类Dev

设置框架语句中的类型不匹配

来自分类Dev

F#If语句类型不匹配错误

来自分类Dev

函数类型与函数定义不匹配

来自分类Dev

问题:锚点与列SQL Server 2005中的递归部分之间的类型不匹配

来自分类Dev

如果语句在函数参数内;分支类型

Related 相关文章

  1. 1

    函数“递归返回”的“类型不匹配”

  2. 2

    Do循环类型中的“ If”语句不匹配

  3. 3

    类内通用递归函数的Kotlin类型不匹配

  4. 4

    Haskell函数中的类型不匹配

  5. 5

    Scala 中的类型不匹配(hasNext 函数)

  6. 6

    map函数中的Scala类型不匹配

  7. 7

    无法在Rust的递归枚举中推断泛型函数的类型

  8. 8

    递归函数中的类型匹配和IO出现问题

  9. 9

    高阶函数中的类型定义和类型不匹配

  10. 10

    递归查询列中的锚点和递归部分之间的类型不匹配

  11. 11

    递归查询“ CTE”的列“ ProductNames”中的锚点与递归部分之间的类型不匹配

  12. 12

    递归CTE错误:类型不匹配

  13. 13

    Fortran 95中的“错误:函数的返回类型不匹配”

  14. 14

    flatMap函数中的Apache Flink流类型不匹配

  15. 15

    错误:声明要返回的函数中的返回类型不匹配

  16. 16

    Access中的DLookup函数返回类型不匹配错误

  17. 17

    Fortran 95中的“错误:函数的返回类型不匹配”

  18. 18

    在QTP中调用函数时类型不匹配

  19. 19

    错误:声明要返回的函数中的返回类型不匹配

  20. 20

    数据类型在函数调用中不匹配

  21. 21

    使用Java的RDD函数中的类型不匹配

  22. 22

    Rust宏与传递的类型不匹配

  23. 23

    循环外的Rust不匹配类型错误

  24. 24

    Excel VBA With语句返回类型不匹配

  25. 25

    设置框架语句中的类型不匹配

  26. 26

    F#If语句类型不匹配错误

  27. 27

    函数类型与函数定义不匹配

  28. 28

    问题:锚点与列SQL Server 2005中的递归部分之间的类型不匹配

  29. 29

    如果语句在函数参数内;分支类型

热门标签

归档