' *'无法强制进入Fixnum(TypeError)

时间:2015-09-06 10:17:23

标签: ruby typeerror

我正在尝试编写一个程序来进行阶乘。我做了这个:

continue_loop=true

def fact(n)
  if n==0
    1
  else
    n*fact(n-1)
  end
end

while continue_loop
  puts "Welcome to the factorial machine. Write a number! Write exit to exit the program"
  user=gets.chomp
  if user=="exit"
    continue_loop=false
  else puts fact(user.to_i)
    puts "--------"
  end
end

我在行上获得* can't be coerced into Fixnum(TypeError)

n*fact(n-1)

else puts fact(user.to_i)

我发现我收到此错误,因为n*fact(n-1)的右侧是nil。但是,我不知道如何做递归。

可以使用inject完成,但我想学习使用递归。

1 个答案:

答案 0 :(得分:0)

你的职能:

def  fact(n)
    if n==0
        1
    else
       n*fact(n-1)
    end
end

很好。 if/else返回两个块的值。为了确保我只是尝试使用fact(5)并返回120。如果出现问题,那就不行了。当然,你的函数fact(-1)失败了,但这是另一个问题。

你的功能无法返回零。它将返回1或乘法结果。因此在n*fact(n-1)中,右手不能为零。左手可能是。找出原因。