【发布时间】:2015-09-17 16:43:06
【问题描述】:
我已经写了一个简单的猜数程序,我需要知道它是否涉及任何类型的递归,以及它是什么类型(原始/尾部)(我是新手,所以请多多包涵我)
module MyProgram where
import System.Random
guessNum :: IO()
guessNum =
do --gen <- newStdGen
--let num = randoms gen :: [Int]
num<-randomRIO(20,100 :: Int)
putStrLn "Guess the number: "
input<-getLine
let guess = (read input :: Int)
checkGuess guess num
checkGuess:: Int -> Int -> IO()
checkGuess guess num1 |(num1<guess)=
do putStr"Too high! Guess again!"
input<-getLine
let guess = (read input)::Int
checkGuess guess num1
|(num1>guess)=
do putStr"Too low! Guess again!"
input<-getLine
let guess = (read input)::Int
checkGuess guess num1
|(num1==guess) =
do putStr"Congratulations! You found the number!"
【问题讨论】:
-
我不是 haskell 专家,但递归是函数调用自身时,我相信“尾递归”仅在自调用是当前迭代执行的最后一条语句时发生(即,它不需要将函数保留在堆栈上,以便它可以返回并执行更多语句)
-
我需要知道我在 checkGuess 中的函数调用 checkGuess 是否涉及递归,因为它不使用之前出现的任何信息,而是在每个实例中传递 num1
-
是的,它是递归的。它不必“使用以前发生的任何信息”。如果它调用自己,它是递归的。仅此而已。
-
在 Haskell 的上下文中,您在哪里遇到了原始递归这个术语?原始递归与 Haskell 没有任何关系。一个函数是否是尾递归的会对 Haskell(以及许多其他函数式语言)的性能产生影响,但它是否是原始递归的,在 TCS 上下文之外并不重要。
标签: haskell recursion functional-programming tail-recursion