Как рекурсивно захватить ввод пользователя - PullRequest
0 голосов
/ 12 марта 2020

Я пытаюсь захватить ввод группы чисел в Go. Мне не разрешено делать петли. Пользовательский ввод многолинейный. Однако приведенная ниже функция не возвращает ожидаемых результатов []int, вместо этого она возвращает пустой массив. Почему это? Или есть другой способ захвата многострочного пользовательского ввода без циклов for?

func input_to_list() []int {
    fmt.Print("continuously enter text: ")
    reader := bufio.NewReader(os.Stdin)
    user_input, _ := reader.ReadString('\n')
    print(user_input)
    var result []int
    if user_input == "\n" {
        return result
    }
    return append(result, input_to_list()...)
}

Ответы [ 2 ]

2 голосов
/ 12 марта 2020

Как рекурсивно захватывать ввод пользователя?

Мне нельзя делать циклы.


Например,

package main

import (
    "bufio"
    "fmt"
    "io"
    "os"
    "strconv"
    "strings"
)

func readInt(rdr *bufio.Reader, n []int) []int {
    line, err := rdr.ReadString('\n')
    line = strings.TrimSpace(line)
    if i, err := strconv.Atoi(line); err == nil {
        n = append(n, i)
    }
    if err == io.EOF || strings.ToLower(line) == "end" {
        return n
    }
    return readInt(rdr, n)
}

func ReadInts() []int {
    fmt.Print("enter integers:\n")
    var n []int
    rdr := bufio.NewReader(os.Stdin)
    return readInt(rdr, n)
}

func main() {
    n := ReadInts()
    fmt.Println(n)
}

Вывод:

enter integers:
42
7
end
[42 7]
0 голосов
/ 12 марта 2020

Ваша функция никогда не присваивает значение result.

func input_to_list() []int {
    /* ... */
    var result []int                          // Create empty `result` slice
    if user_input == "\n" {
        return result                         // Return empty result slice
    }
    return append(result, input_to_list()...) // Combine two empty slices, and return the (still) empty slice
}

Давайте пройдем по шагам:

  1. Вы создаете пустой срез с именем result
  2. Если user_input пусто, вы немедленно возвращаете результат.
  3. Если user_input не пусто, вы вызываете input_to_list() рекурсивно и добавляете его (пустой) результат к вашему пустому результату, а затем возвращаете это (все еще) пустой результат.

Чтобы получить желаемое поведение, вы должны что-то делать (кроме проверки пустоты) с помощью user_input. Возможно, что-то связано с strconv.Atoi или подобным, затем добавьте это к result.

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