我需要编写递归函数Repl 在Expr中将e中的表达式作为输入,并在Expr中返回表达式 其中每个数字由数字1代替。 例如,如果e是表达式 ((((9 + 5)* 2)*(2 +(4 * 6)))) 然后Repl(e)就是表达式 ((((1 + 1)* 1)*(1 +(1 * 1))))
任何人都可以帮我解决这个问题吗? 迭代的一个很容易写,但如何递归写?
答案 0 :(得分:1)
目前尚不清楚为什么要为此问题提供递归解决方案,但解决方案相对简单。这是伪代码:
string replace(string s, bool seenDigit) {
if (s == "") {
// The string is empty : we are done
return "";
}
if (s[0] is digit) {
if (seenDigit) {
// This is a second, third, etc. digit in a multi-digit chain
// It has been replaced with "1" already, so we cut it out
return replace(s.substring(1), true);
} else {
// This is the first digit in a chain of one or more digits
// Replace it with "1", and tell the next level that we've
// done the replacement already
return "1"+replace(s.substring(1), true);
}
} else {
// Non-digits do not get replaced
return s[0] + replace(s.substring(1), false);
}
}
s[0]
表示第一个字符; string+string
表示连接。
答案 1 :(得分:1)
使@ dasblinkenlight的解决方案尾递归:
string replace(string sToGo, string sSoFar, bool inNumber) {
if (sToGo == "") {
return sSoFar;
}
if (sToGo[0] is digit) {
if (isNumber) {
return replace(sSoFar, sToGo.substring(1), true);
} else {
return replace(sSoFar+"1", sToGo.substring(1), true);
}
} else {
return replace(sSoFar+s[0], sToGo.substring(1), false);
}
}
请注意,每个返回值都是直接值(基本情况)或直接返回递归调用返回的内容。这意味着程序不需要跟踪递归调用,因为除了将其返回到链之外,与返回的值无关,这意味着(如果解释器利用它),主要的缺点是使用递归(堆栈的开销)可以消除。