递归函数,除以两个整数和 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)

请注意此函数如何简单地将 div1div2 的结果合并到一个元组中,然后在递归调用后解构它们。

divMod 5 5
> (0, 1)
divMod 5 3
> (2, 1)
divMod 7 3
> (1, 2)

另请注意,我使用的是柯里化参数 divMod n m 而不是您使用的元组参数 div1 (n, m)。归根结底,这是一个品味问题,但作为专业提示,我想指出柯里化参数在实践中更有用。