递归函数,除以两个整数和 returns 结果和余数
Recursive Function that divides two integers and returns result and remainder
我正在尝试创建一个递归函数来除以两个整数 n 和 m,然后显示结果和除法的余数。
基本上我创建了两个独立的函数,它们完全符合我的要求:
let rec div1 (n: int, m: int): int =
if n<m then n else div1(n-m, m)
printfn "Remainder: %i" (div1(5,5))
let rec div2 (n: int, m: int): int =
if n<m then 0 else 1+div2(n-m, m)
printfn "Result: %i" (div2(5,5))
问题是,我想同时执行这两项操作,我的意思是在 let rec div12 (n: int) (m : int): int * int =
这样的一个函数中,而不是在两个单独的函数中。
我不确定这在 F# 上究竟如何工作。
一个函数可能 return 不仅仅是一个数字。例如,一个函数可以 return 两个数字的元组:
let f x = (x, x+5)
f 5
> (5, 10)
此外,您可以用类似的方式解构return这样一个函数的值:
let (x, y) = f 5
x
> 5
y
> 10
现在我们可以使用它来得到我们的 div+mod 函数 return 两个结果 - 余数和商:
let rec divMod n m =
if n < m
then
(n, 0)
else
let (remainder, quotient) = divMod (n-m) m
(remainder, quotient + 1)
请注意此函数如何简单地将 div1
和 div2
的结果合并到一个元组中,然后在递归调用后解构它们。
divMod 5 5
> (0, 1)
divMod 5 3
> (2, 1)
divMod 7 3
> (1, 2)
另请注意,我使用的是柯里化参数 divMod n m
而不是您使用的元组参数 div1 (n, m)
。归根结底,这是一个品味问题,但作为专业提示,我想指出柯里化参数在实践中更有用。
我正在尝试创建一个递归函数来除以两个整数 n 和 m,然后显示结果和除法的余数。
基本上我创建了两个独立的函数,它们完全符合我的要求:
let rec div1 (n: int, m: int): int =
if n<m then n else div1(n-m, m)
printfn "Remainder: %i" (div1(5,5))
let rec div2 (n: int, m: int): int =
if n<m then 0 else 1+div2(n-m, m)
printfn "Result: %i" (div2(5,5))
问题是,我想同时执行这两项操作,我的意思是在 let rec div12 (n: int) (m : int): int * int =
这样的一个函数中,而不是在两个单独的函数中。
我不确定这在 F# 上究竟如何工作。
一个函数可能 return 不仅仅是一个数字。例如,一个函数可以 return 两个数字的元组:
let f x = (x, x+5)
f 5
> (5, 10)
此外,您可以用类似的方式解构return这样一个函数的值:
let (x, y) = f 5
x
> 5
y
> 10
现在我们可以使用它来得到我们的 div+mod 函数 return 两个结果 - 余数和商:
let rec divMod n m =
if n < m
then
(n, 0)
else
let (remainder, quotient) = divMod (n-m) m
(remainder, quotient + 1)
请注意此函数如何简单地将 div1
和 div2
的结果合并到一个元组中,然后在递归调用后解构它们。
divMod 5 5
> (0, 1)
divMod 5 3
> (2, 1)
divMod 7 3
> (1, 2)
另请注意,我使用的是柯里化参数 divMod n m
而不是您使用的元组参数 div1 (n, m)
。归根结底,这是一个品味问题,但作为专业提示,我想指出柯里化参数在实践中更有用。