Вычисление простых чисел в Rust - PullRequest
0 голосов
/ 22 апреля 2019

Я пытаюсь вычислить простые числа в Rust, но у меня есть некоторые проблемы.Я получил две ошибки.Я не понимаю, как значение возвращается к основной функции.

fn main() {
    let x = is_prime(25); //function calling
    println!("{}", x);
}

fn is_prime(n: u32) -> bool {
    let mut result: bool = for a in 2..n {
        result = if n % a == 0 { false } else { true };
    };
    result
}
error[E0425]: cannot find value `result` in this scope
 --> src/main.rs:8:9
  |
8 |         result = if n % a == 0 { false } else { true };
  |         ^^^^^^ not found in this scope
help: possible candidates are found in other modules, you can import them into scope
  |
1 | use futures::future::result;
  |
1 | use tokio::prelude::future::result;
  |

error[E0308]: mismatched types
 --> src/main.rs:7:28
  |
6 |   fn is_prime(n: u32) -> bool {
  |                          ---- expected `bool` because of return type
7 |       let mut result: bool = for a in 2..n {
  |  ____________________________^
8 | |         result = if n % a == 0 { false } else { true };
9 | |     };
  | |_____^ expected bool, found ()
  |
  = note: expected type `bool`
             found type `()`

Ответы [ 2 ]

2 голосов
/ 22 апреля 2019

У вас есть несколько проблем в вашем коде (игнорируя, что он не компилируется):

  • вы перезаписываете результат -> представьте n = 4.Когда вы делите на 2, вы получаете result = true, но на следующей итерации, когда вы делите на 3, вы получаете result = false
  • , если n<=2 ваш цикл никогда не будет выполнен, следовательно, в результате будет

Вместо того, чтобы пытаться использовать какой-либо новый фрагмент синтаксиса, попробуйте написать его так, чтобы он был максимально читабельным:

fn is_prime(n: u32) -> bool {
    let limit = (n as f64).sqrt() as u32;

    for i in 2..=limit {
        if n % i == 0 {
            return false;
        }
    }

    true
}
2 голосов
/ 22 апреля 2019

Проблема с вашим кодом в том, что вы используете переменную result при ее определении

...
let mut result: bool = for a in 2..n { // declared here
    result = if n % a == 0 { // used here, but it is still not initialized
...

Вы можете легко обойтись без переменной result, не обязательно:

fn is_prime(n: u32) -> bool {
    for a in 2..n {
        if n % a == 0 {
            return false; // if it is not the last statement you need to use `return`
        }
    }
    true // last value to return
}

Ссылка на игровую площадку

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...