for 循环
考虑这样一个问题: 打印 1, 2, 3,…, 10, 每个 占 一行。
本着“ 解决问题 第一” 的思想, 很容易写出程序: 10 条 printf 语句就可以了。 或者也可以写一条, 每个数 后面加 一个“\ n” 换行符。 但如果把 10 改成 100 呢? 1000 呢? 甚至这个重复次数是可变的:“ 输入正整数 n, 打印 1, 2, 3,…, n, 每个占一行。” 又怎么办呢? 这时可以使用 for 循环。
程序 2-1: 输出 1, 2, 3,…, n 的 值
C语言代码:
#include <stdio.h>
int main() {int n; scanf("% d", &n); for (int i = 1; i <= n; i++) printf("% d\ n", i); return 0;
}
Haskell 代码:
nums 0 = []
nums n = (nums (n - 1)) ++ [n]main = do s <- getLinereturn (nums (read s))
Haskell 语言采用递归定义实现 C 语言循环语句功能。
完全平方数
问题 aabb 输出所有形如 aabb 的 4 位完全平方数(即前两位数字相等, 后两位数字也相等)。
【分析】分支和循环结合在一起时功能强大: 下面枚举所有可能的 aabb, 然后判断它们是否 为完全平方数。 注意, a 的范围是 1 ~ 9, 但 b 可以是 0。 主程序如下:
C语言代码:
#include <stdio.h>
#include <math.h>
int main() { for (int a = 1; a <= 9; a++) for(int b = 0; b <= 9; b++) { int n = a* 1100 + b* 11; //这里 才 开始 使用 n, 因此 在这里 定义int m = floor(sqrt(n) + 0. 5); if (m*m == n) printf("% d\ n", n); } return 0;
}
Haskell语言代码:
isSqr' n m| m == 0 = False| n == m*m = True| otherwise = isSqr' n (m-1)
isSqr n = isSqr' n (n-1)main = do return [n | a<-[1..9], b<-[0..9], let n = 1100*a+11*b, isSqr n]
在 haskell 中,可以用列表推导式解决数据遍历、数据暴力穷举类型的问题。