首页 > 解决方案 > 尾递归错误:表达式具有 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

标签: ocaml

解决方案


您缺少该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 ;;

推荐阅读