【发布时间】:2015-01-29 16:34:34
【问题描述】:
所以我是第一次使用 C,我认为我在使用递归时遇到了麻烦。例如,要为 C# 中的递归调用返回一个值,我可能会使用 return methodRecursiveCall(parameter)。在 C 中,我有这个语句,它是罗马数字转换器的一部分:
int convert(char *s)
{
int val = 0;
int index = 0;
int length = strlen(s);
while (length >1)
{
if (s[index] == 'I')
{
if(s[index + 1] == 'V' || s[index + 1] == 'X' || s[index + 1] == 'C' || s[index + 1] == 'D' || s[index + 1] == 'M')
{
val--;
index++;
length--;
convert(&(s[index]));
}
else
{
val++;
index++;
length--;
convert(&(s[index]));
}
}
if (s[index] == 'V')
{
if(s[index + 1] == 'X' || s[index + 1] == 'C' || s[index + 1] == 'D' || s[index + 1] == 'M')
{
val = val - 5;
index++;
length--;
convert(&(s[index]));
}
else
{
val = val + 5;
index++;
length--;
convert(&(s[index]));
}
}
if (s[index] == 'X')
{
if(s[index + 1] == 'C' || s[index + 1] == 'D' || s[index + 1] == 'M')
{
val = val - 10;
index++;
length--;
convert(&(s[index]));
}
else
{
val = val + 10;
index++;
length--;
convert(&(s[index]));
}
}
if (s[index] == 'C')
{
if((s[index + 1]) == 'D' || (s[index + 1]) == 'M')
{
val = val - 100;
index++;
length--;
convert(&(s[index]));
}
else
{
val = val + 100;
index++;
length--;
convert(&(s[index]));
}
}
if (s[index] == 'D')
{
if(s[index + 1] == 'M')
{
val = val - 500;
index++;
length--;
convert(&(s[index]));
}
else
{
val = val + 500;
index++;
length--;
convert(&(s[index]));
}
}
if (s[index] == 'M')
{
val = val + 500;
index++;
length--;
convert(&(s[index]));
}
}
return val;
}
我的问题是关于convert(&(s[index]));,它是一个递归调用。它旨在将整个罗马数字转换为十进制,但它只转换第一个字符。这通常是我会“退货”的地方。但是,我不确定如何在 C 中实现这一点。
【问题讨论】:
-
我看不出在这里使用递归有什么意义。您的函数被赋予一个
char*指针作为参数。为什么不单步执行并使用单个循环处理输入字符串(例如,while (*s) { ... })。另外,尝试使用switch语句而不是所有if构造。 -
你似乎忘记了
L,又名50。 -
你可以像在 C# 中那样做。
return convert(&(s[index]));你试过了吗,它是否像你期望的那样工作?我没有检查逻辑错误或任何东西,但这就是返回值的全部内容。您在 C# 中成功尝试过该算法吗? -
C 中的递归没有什么特别之处。您已经发现了
return关键字。问题在于这些函数的递归逻辑。内部带有递归的 while 循环似乎很奇怪。而且你在调用convert之后永远不会使用返回的值。 -
您正在调用
convert并忽略返回值。你为什么叫它?你预计会发生什么?
标签: c recursion roman-numerals