go - 如何在golang中递归读取输入

标签 go recursion

在一次递归后的以下代码中,不会读取输入(从标准输入)。如果 N 大于 1,则输出不正确。 一次递归调用后 X 被读取为 0,因此此后不再读取数组。 程序应该打印数组中正数的平方和。 P.S 必须仅使用递归来完成

package main

// Imports
import (
    "fmt"
    "bufio"
    "os"
    "strings"
    "strconv"
)

// Global Variables
var N int = 0;
var X int = 0;
var err error;
var out int = 0;
var T string = "0";         // All set to 0 just in case there is no input, so we don't crash with nil values.

func main() {
    // Let's grab our input.
    fmt.Print("Enter N: ")
    fmt.Scanln(&N)
    // Make our own recursion.
    loop()
}

func loop() {
    if N == 0 {return}

    // Grab our array length.
    fmt.Scanln(&X)

    tNum := make([]string, X)

    // Grab our values and put them into an array.
    in := bufio.NewReader(os.Stdin)
    T, err = in.ReadString('\n')
    tNum = strings.Fields(T)

    // Parse the numbers, square, and add.
    add(tNum)

    // Output and reset.
    fmt.Print(out)
    out = 0;

    N--
    loop()
}

// Another loop, until X is 0.
func add(tNum []string) {
    if X == 0 {return}

    // Parse a string to an integer. 
    i, err := strconv.Atoi(tNum[X-1])
    if err != nil {}

    // If a number is negative, make it 0, so when we add its' square, it does nothing.
    if (i < 0) {
        i = 0;
    }

    // Add to our total!
    out = out + i*i

    X--
    add(tNum)
}

Input: 
2
4
2 4 6 8
3
1 3 9
Output:
1200
Expected output:
120
91

最佳答案

bufio.Reader,顾名思义,使用一个缓冲区来存储阅读器中的内容(这里是os.Stdin),这意味着,每次创建一个 bufio.Reader 并读取一次,缓冲区中存储的内容会多于读取的内容,因此下次从读取器读取时 (os.Stdin) ,您不会从离开的地方继续阅读。

对于 os.Stdin,您应该只有一个 bufio.Reader。使其成为全局性的(如果这是一个要求)或使其成为一个参数。事实上,bufio 包有一个 Scanner 类型,可以分割空格和换行符,因此您不需要调用 strings.Fields

我认为你应该自己练习这样做,但这里有一个 Playground 链接:https://play.golang.org/p/7zBDYwqWEZ0

关于go - 如何在golang中递归读取输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59216815/

相关文章:

go - 如何将接口(interface) slice 更改为结构 slice

c++ - 如何使用递归反转链表?

python - 在 python 中使用字典进行动态绑定(bind)?

swift - 快速剖析排列算法

list - Haskell函数交换列表中的第二个元素

go - 如何重建net/http库

linux - 审核 netlink 响应没有正确的数据包长度

go - 向两个 channel 发送数据,第二个 channel 有时可能会先接收到数据

go - 使用互斥锁 - 仍然是死锁

javascript - 忙等待替代方案