在一次递归后的以下代码中,不会读取输入(从标准输入)。如果 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/