为什么C#语言设计者可能不支持这样的东西(从计算机程序的结构和解释,第二版,第30页):
/// <summary>Return the square root of x.</summary>
double sqrt(double x) {
bool goodEnough(double guess) {
return Math.Abs(square(guess) - x) < 0.001;
}
double improve(double guess) {
return average(guess, x / guess);
}
double sqrtIter(double guess) {
return goodEnough(guess) ? guess : sqrtIter(improve(guess));
}
sqrtIter(1.0);
}
Run Code Online (Sandbox Code Playgroud)
yfe*_*lum 36
事实上,C#就是这样.
double sqrt(double x) {
var goodEnough = new Func<double, bool>(guess =>
Math.Abs(square(guess) - x) < 0.001
);
var improve = new Func<double, double>(guess =>
average(guess, x / guess)
);
var sqrtIter = default(Func<double, double>);
sqrtIter = new Func<double, double>(guess =>
goodEnough(guess) ? guess : sqrtIter(improve(guess))
);
return sqrtIter(1.0);
}
Run Code Online (Sandbox Code Playgroud)
就像Justice说的那样,你可以用C#3.5和lambdas做到这一点; 如果你有C#2.0,你可以使用匿名函数,虽然它会不那么性感:
double sqrt(double x) {
Func<double, bool> goodEnough = delegate(double guess) {
return Math.Abs(square(guess) - x) < 0.001;
};
Func<double, double> improve = delegate(double guess) {
return average(guess, x / guess);
};
Func<double, double> sqrtIter = null;
sqrtIter = delegate(double guess) {
return goodEnough(guess) ? guess : sqrtIter(improve(guess));
};
return sqrtIter(1.0);
}
Run Code Online (Sandbox Code Playgroud)
编辑:我忘了,Func没有在C#2.0中定义,所以你必须自己定义:
public delegate TResult Func<T, TResult>(T guess);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3545 次 |
| 最近记录: |