2015-09-06 80 views
-1

我正在尝试编写一个程序来执行阶乘。我做了这个:'*'不能被强制转换为Fixnum(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完成,但我想学习使用递归。

+0

你的程序似乎很好,我只是复制粘贴它,它工作得很好。你可以尝试在网上翻译中重现吗? https://repl.it/languages/ruby –

+0

你的问题是什么? – sawa

+1

@sawa感谢编辑和对我的错误感到抱歉,英语不是我的母语,正如你所看到的,我对编程很陌生)。我会尽量不要在将来的问题中提出这些问题(以及包括实际问题)。 – Lenok

回答

0

您的功能:

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

是罚款。 if/else返回来自两个块的值。只是为了确定我刚刚尝试了fact(5)并且它返回了120。如果有什么不对,它不会。当然,你的功能fact(-1)失败,但这是另一个问题。

你的函数不能返回nil。它将返回1或乘法结果。因此在n*fact(n-1)右手不能为零。左手可能是。找出为什么。

+0

我很抱歉,但我无法看到左手怎么可以'无'。 – Lenok

+0

@Lenok:说实话,我一味地认为'user.to_i'会在输入垃圾时产生错误的值。但我认为这不会是'零'。但是,我检查了你的代码,即使对于垃圾输入也是正常的(除了负数,它会发生堆栈溢出)。然后我记得'to_i'在无法转换时返回'0',所以,这里没有零。现在我重新读取了错误信息,它宣称'*'不能被转换,而不是'nil'。这可能表明'n'可能是==到'“*”'(带有星号的字符串)或者具有类似级别古怪的东西。 – quetzalcoatl

+0

,但即使我尝试过,'to_i'只是简单地返回了'0',就像垃圾输入一样。所以,我不知道。由于你的程序在重新启动IRB之后开始工作,那么这会对该会话造成一些意外损坏(如意外重新定义一些基本方法,如&:*或to_s)。或者在IRB中可能存在一些错误?对不起,没有想法。 – quetzalcoatl

相关问题