ocaml - 尾递归错误:表达式具有 int 类型,但表达式应为 unit 类型
问题描述
我刚开始在学校的一门课上使用 OCaml 函数式编程语言进行编程。我们的问题之一是编写所谓的“俄罗斯农民算法”,但使用尾递归而不是正常递归。我想我差不多明白了,但我一直遇到一个我似乎无法准确指出的愚蠢错误;“此表达式具有 int 类型,但预期为 unit 类型的表达式”在“aux x (base*base) (power/2)”行上。我真的不知道如何解决这个问题,因为我是语言语法的新手。有任何想法吗?
我认为这是由没有分支的条件引起的;但是我已经实现了这个,所以我很困惑为什么它不起作用。
let even n = (n mod 2) = 0 ;;
let odd n = (n mod 2) = 1;;
let exp_program (base, power) =
let rec func x base power =
if base = 0 then 0
else if power = 0 then x
else if power = 1 then x*base
else if (odd power) then
func (x*base) (base*base) ((power-1)/2)
else if (even power) then
func x (base*base) (power/2)
in
func 1 base power ;;
该函数的目标是调用 exp_program (2, 3) 并让它产生 base^power。在这种情况下,它将导致 8
解决方案
您缺少该else
条款。
解决方案:删除最后一个else if
并替换为else
.
let exp_program (base, power) =
let rec func x base power =
if base = 0 then 0
else if power = 0 then x
else if power = 1 then x*base
else if (odd power) then
func (x*base) (base*base) ((power-1)/2)
else
func x (base*base) (power/2)
in
func 1 base power ;;
推荐阅读
- generics - rust 无法为泛型类型实现 From
- c - how can I read multiple inputs from stdin in c using fgets
- c# - 递归计算任务的子任务
- virtual-reality - 查看 WebXR 内容时闪烁
- php - php cfoutput 查询组
- express - 使用 Express 的 GraphQL 安全 Web 套接字
- r - 计算数据框中行的长度
- angular - 将时间转换为 24 小时格式并使用 formControlName 获取值并填充值,角度
- python - 如何逐行合并多个csv文件python
- ruby - 左零数有奇怪的结果