pascal 由键盘上输入任意n个一位数数输出它的全排列

最好能详细介绍一下算法

一、 引入:
fpc-2.0.0.i386-win32
程序一:已知长方形的长、宽,求长方形的周长
program circle; 该程序的首部,program是保留字
var chang,kuan,zhouchang:real; 定义变量:设定长,宽,周长为实数类型
begin 开始语句
readln(chang); 读语句,读入长(chang)和宽(kuan)
readln(kuan);
zhouchang:=2*(chang+kuan); 赋值语句,将计算结果赋给zhouchang
write(zhouchang); 写语句,将结果(zhouchang)
end. 结束语句,与begin成对出现

程序二:已知长方形的长、宽,求长方形的周长,并求出长方形的面积。
rogram circle;
var chang,kuan,zhouchang,mianji:real;
begin
readln(chang);
readln(kuan);
zhouchang:=2*(chang+kuan);
mianji:=chang*kuan;
write(zhouchang,mianji);
end.

小结:一个完整的pascal程序结构
Program 程序名(程序参数表);
var
变量说明;
Begin
语句;
语句;
……
End.
编译:Alt+F9
运行 Ctrl+F9
返回看结果Alt+F5
思考练习:
1、已知长方体的长、宽、高,求长方体的表面积及体积。
2、已知正方体的边长,求正方体的表面积及体积。
3、已知圆半径,求圆的周长及面积。

作业
已知圆半径,求圆的周长及面积。3.14若改成3.14159
第一句为程序首部,每个pascal程序都必须以它开头。
增加程序的可读性,用pi表示
一、常量说明
Const pi=3.14159
变量说明
VAR 单个变量或用逗号分开的多个变量
<变量表>:<类型>
二、标准数据类型
(一)、实型(real)
1、两种表示方法:小数表示法和指数表示法
小数表示法:1.25,0.0025,258.2,253.0
科学表示法:1.25e0,1.3654e+2,2.5e-3,
0e0,1e2
2、说明方式
const k=1.26
var m,n:real;
3、运算:+(加),—(减),*(乘),/(除)
标准函数:
abs(绝对值),sqr(平方),sqrt(开方),

trunc(取整),round(舍入取整)
(二)、整型(integer)
1、表示方法:25,-456,0
2、说明方法:
const long=150;
wide=65;
var I,j,k:integer;
3、整型量的运算:
+(加),—(减),*(乘),div(整除)
/(除)得到的值为实型,mod(取余) 4、用于整数的标准函数
abs(绝对值),sqr(平方),pred(前导)
succ(后续),
三、
读语句一:read
用于在程序执行时,从外部输入数据给变量
一般形式:read(变量表) 其中变量表是一些由逗号分开的变量
程序一、读入2个整数和1个实数,并将这三个数输出。
Program shu;
Var
x,y:integer;
z:real;
begin
read(x);
read(y);
read(z);
write(x);
write(y);
write(z);
end. Program shu;
Var
x,y:integer;
z:real;
begin
read(x,y,z);
write(x,y,z);
end.

可以将读入与写出语句合并成一句。
注意:从键盘上输入的数据必须与程序中设定的输入变量的类型相同。例如上题,x,y是整型,我们从键盘上输入就必须是整型数,例如:14、-6,而不能是实型数,例如:1.9、98.0;而z是实型数,输入可以是小数也可以是整数,例如:2.36666 ,或者是10。

读语句二:readln
在完成该语句的最后一个变量值的输入以后,将结束包括这个数据值的输入行,使下一个read语句(或readln语句)从下一个新行开始输入数据。
例:
Program shu2;
Var a,b:real;
begin
Read(a,b);
Read(c,d,e,f);
Read(g,h);
Writeln(a,b,c,d,e,f,g,h);
End. Program shu2;
Var a,b:real;
begin
Readln(a,b);
Readln(c,d,e,f);
Readln(g,h);
Writeln(a,b,c,d,e,f,g,h);
End.
从键盘上输入以下数据:
1.5 3.7 2.4
5.7 2.1 8.9
9.2 1.7 5.3
2.8 3.4 2.9
得到的结果:
a=1.5 b=3.7
c=2.4 d=5.7 e=2.1 f=8.9
g=9.2 h=1.7 得到的结果:
a=1.5 b=3.7
c=5.7 d=2.1 e=8.9 f=9.2
g=2.8 h=3.4
四、表达式与赋值语句
一般形式:<变量>:=<表达式>
表达式可以是简单的常数、常量、变量、函数或它们之间的算术运算、逻辑运算、关系运算等
例如:2+3x

1.25×10-5

写表达式时,要注意以下几点:
1、所有表达式必须以线形写出。
2、只能使用合法的标志符
3、乘号必须用符号“*”明确地指出,不得省略
4、函数的自变量可以是任意表达式。
注意:赋值语句中,表达式的类型必须与左端变量的类型赋值相容。
(1)、表达式的类型与左端变量的类型相同
(2)、表达式为整型,左端变量为实型
var I,j,k:integer
k:=I/j
X:=x+1 I:=I+1
写语句一:Write语句
将计算结果通过屏幕或打字机输出显示。
例如:write(aa,bb);
一般形式:write(<输出表>:场宽:小数位数)
输出表是一些由逗号分开的输出项。
输出项可以是变量或表达式,或用引号括起来的字符串。
若为变量,则输出变量的值。
若为表达式,则先计算表达式的值,然后将值输出。
若为字符串,则输出字符串本身。
若为用符号’ x+y= ’ ,则将单引号内的值原样输出
例如:输入:x=5,y=6
write(x,y,x+y,x*y)
输出结果:5,6,11,30
write(‘x=‘,x,’y=‘,y,’x+y=‘,x+y,’x*y=‘,x*y);
输出结果:x=5y=6x+y=11x*y=30

写语句二:Writeln语句
结果将输出在不同的行上。
在印出输出表的最后一个输出项后,结束当前输出行,使得下一个write(或writeln)语句从下一个新行的开头输出。即:印出输出项后,回车换行,光标移到下一行的首位。
例如:
Writeln 可以单独使用,用于结束当前输出行,指向下一行的开始
writeln(‘x=‘,x,’y=‘,y);
Writeln(’x+y=‘,x+y,’x*y=‘,x*y);

例:
1、写一程序读入三角形的三个边a,b,c,计算并输出三角形的面积S。可利用下列公式计算:S= ,其中p= 。
2、输入一个三位整数,将它反向输出。例如输入127,输出应为721。

常量说明,不一定要有
三、字符型
1、表示方法: ‘A’,’B’,’C,’,…… ‘a’,’b’,’c’,…… ‘0’,’1’,’2’,’3’,…… ‘+’,’-’,’*’,…… ‘’代表空格字符
2、说明方法
const black=‘’ star=‘*’ var ch1,ch2:char;
3、用于字符的标准函数
ord(取序号),pred(前导),succ(后继)
chr(65)=‘A’ chr(97)=‘a’ ord(‘A’)=65 ord(‘a’)=97
四、布尔型(boolean)
1、说明
const f=false;
t=true;
var b1,b2,flag:boolean;
2、标准函数
odd(取序号)、pred(前导)、succ(后继)、
odd(false)=0 odd(true)=
pred(true)= succ(false)=
3、用于布尔量运算有布尔逻辑运算(即逻辑运算)
AND(与)OR(或) NOT(非)
B1 B2 NOT B1 B1 AND B2 B1 OR B2
FALSE FALSE
FALSE TRUE
TRUE FALSE
TRUE TRUE
4、关系运算
<(小于),<=(小于等于),=(等于)
>(大于),>=(大于等于),<>(不等于)
关系运算可以用于整型、实型、字符型、布尔类型。
结果均为布尔型
例:3<6=
3<7.8=
false<true=
‘a’>=‘b’=
判断(x,y)是否在第一象限
6、表达式按下列运算优先规则计算
(1)、所有括起来的子表达式必须首先计算,且子表达式必须从里到外计算。
(2)、在同一表达式中的运算符按下列次序计算:
①函数
②not
③AND,*,/,DIV,MOD
④OR,+,-
⑤<,<=,=,>,>=,<>
(3)、同一个表达式中,同一优先级按从左到右注意:赋值语句中,表达式的类型必须与左端变量的类型赋值相容。
a、表达式的类型与左端变量的类型相同
b、表达式为整型,左端变量为实型
var I,j,k:integer
k:=I/j
X:=x+1 I:=I+1

Write语句
将计算结果通过屏幕或打字机输出显示。
例如:write(aa,bb);
一般形式:write(<输出表>:场宽:小数位数)
输出表是一些由逗号分开的输出项。
输出项可以是变量或表达式,或用引号括起来的字符串。
若为变量,则输出变量的值。
若为表达式,则先计算表达式的值,然后将值输出。
若为字符串,则输出字符串本身。
若为用符号’ x+y= ’ ,则将单引号内的值原样输出
例如:输入:x=5,y=6
write(x,y,x+y,x*y)
输出结果:5,6,11,30
write(‘x=‘,x,’y=‘,y,’x+y=‘,x+y,’x*y=‘,x*y);
输出结果:x=5y=6x+y=11x*y=30

1、 输入三个字符,然后按输入字符次序输出这三个字符,再输出每个字符的序号,最后按与输入字符相反的次序输出这三个字符。
2、 输入两组x,y值,由程序根据它们是否在斜线区域内,输出不同的值。若在斜线区域内,输出true,否则输出false。

三、选择结构程序设计
程序一:期末成绩,如果成绩在60分以上的为合格,60分以下的为不及格,如何表示?
program pd;
var
x:real;
begin
read(x); 读入成绩
if x>=60 then write(‘pass’)
else write(‘not pass’); 用if语句进行判断,如果>=60打印“pass ” 否则打印“not pass”
End.

选择结构语句一:If语句格式
IF语句格式1:IF〈条件〉THEN 〈语句1〉
ELSE 〈语句2〉
IF语句格式2:IF〈条件〉THEN 〈语句1〉

程序二:火车托运行李,要根据重量按不同的标准收费。例如不超过50kg,按每公斤0.35元收费。若超过50k按每公斤0.35元收费,其余超过部分按每公斤0.50远收费。现输入托运行李重量,要求计算并输出托运费。
Program compay;
var
weight,pay:real;
begin
readln(weight); 读入行李重量
if weight<=50 then pay:=weight*0.35 判断语句
else pay:=50*0.35+(weight-50)*0.5;
Writeln(‘pay=‘,pay); 打印付费结果
end.

注意:If语句中,如果<语句一>或者<语句二>,执行的内容无法用一个语句实现,可以使用复合语句,用begin 和end将执行的语句合并成一个复合语句。
复合语句格式:BEGIN
〈语句1〉;
〈语句2〉;
……;
END;
程序三:输入一个数字,如果该数字大于100,则先输出这个数,并将该数减去100,并将减去100后的结果输出,否则输出“no”。
Program number;
Var x,y:real;
Begin
read(x); 读入该数x
If x>100 then 对x进行判断
Begin 用begin和end将三个语句合并成一个复合语句
writeln(x);
x:=x-100;
writeln(x);
end
else writeln(“no”);
End.

复合判断条件语句:当<条件>中包含的不仅只有一个语句,而是多个条件时,可以使用and\or\not复合判断条件
AND:与、和 ,条件都成立时为真
OR:或者,只要有一个条件成立时为真
NOT:非,
程序四:输入一个成绩,如果该成绩小于90并且大于等于70,则输出“ok”
程序:Program score;
var k:real;
begin
read(k);
if (k>=70) and (k<90) then write(‘ok’);
end.
复合IF语句
程序五、输入某学生成绩,若成绩在85分以上,输出“A”,若成绩在60分到85分之间,包含60和85,输出“B”,若成绩低于60分,输出“C”。
该题有三重判断,如何实现?
应用复合IF语句:
read(成绩)
IF 成绩>85 then write(’A’) 第一重IF
Else if 成绩>=59 then write (‘B’) 第二重IF
Else write(‘C’);
复合IF语句格式:
IF〈条件1〉 THEN 〈语句1〉
ELSE IF〈条件2〉 THEN〈语句2〉
ELSE〈语句3〉

If语句练习题:
1、 从键盘上输入一个正整数,判断奇数、偶数。如果为奇数则输出“YES”,如果为偶数则输出“NO”。
2、 读入两个数,找出其中最大的数,并输出。
3、 输入一个数,判断该数是正数、负数还是零,为正数输出“zheng”,为负数输出“fu”,为零输出“0”。
Program circle;
Var num:integer;
Begin
Read(num);
If num>0 then writeln(‘zheng’)
Else if num<0 then writeln(‘fu’)
Else writeln(‘0’);
End.
4、 对一批货物征收税收。价格在1万元以上的货物征税5%,在5000元以上,1万元以下的货物征税3%,5000元以下的货物征税2%,1000元以下的货物免税。编一程序,读入货物价格,计算并输出税金。
Program test;
Var price,tax:real;
Begin
Read(price);
If price>=10000 then tax:=price*0.05
Else if price>=5000 then tax:=price*0.03
Else if price>=1000
then tax:=price*0.02
Else tax:=0;
Writeln(‘tax=’,tax);
End.
5、 输入一个数,如果这个数能同时满足用3除余2,用5除余3,用7除余2的所有整数,则输出“yes”。
Program sum;
Var a:integer;
Begin
If (a mod 3=2) and (a mod 5=3) and (a mod 7=2) then write(‘yes’);
End.
6、输入3个字母,按字母表顺序从小到大输出这3个字母。

7、读两个数将大数存于X,小数存于Y。
8、输入一个年份,判断是否是闰年,如果是则输出“yes”,否则输出“no”
目前公认的闰年判断算法,满足下列二者之一,即为闰年:
① 能被4整除,但不能被100整除
② 能被4整除,且能被400整除
9、输入一个加减式,根据输入的式子,判断运算符号,求出结果。例如从键盘上输入:+,5 , 3,则输出为8;例如输入:-,10 , 6,则输出为5。
10、输入一个1000以内的任意一个数,如果这个数中至少有一位数字是5,则输出“yes”,否则输出“no”。
11、输入一个三位的数,判断该数是否为水仙花数,是则输出“flower”。(水仙花数:若三位数abc,a^3+b^3+c^3=abc ,则称该数为水仙花数)
12、输入一个1000以内的数,判断该数是否为守行数(若某数的平方,其低位与该数本身相同,则称该数为守行数。例如25,252=625,62=36,平方值的低位与原数相同,25、6为守行数)。

选择结构语句二:CASE语句:是实现选择结构程序设计的另一种语句。
程序一:输入班号,输出该班学生人数。
班号: 1 2 3 4 5 6
人数: 50 52 50 50 52 55
使用IF语句:
Program number;
Var x:integer;
Begin
Read(x);
If (x=1) or (x=3) or (x=4) then write(50)
Else if x=6 then write(55)
Else write(52);
End.

使用CASE语句:
Program number;
Var x:integer;
Begin
Read(x);
Case x of
1, 3, 4:write(50);
6 :write(55);
2, 5 :write(52);
end
end.

CASE语句的一般形式是:
CASE <表达式> OF 表达式:必须是有序类型(整型、字符型、布尔型)
<值表1>:<语句1>; 值表1:为具体的值列表,用逗号隔开
<值表2>:<语句2>;
……
<值表n>:<语句n>
END
练习:
1、输入年、月,输出该月有几天。(每年的1、3、5、7、8、10、12,每月有31天;4、6、9、11月,每月有30天;2月闰年有29天,平年有28天。年号能被4整除,但不能被100整除,或者年号能被400整除的年份均是闰年)
2、输入两个运算量及一个运算符(+,-,*,/),输出运算结果。
例如:输入 6 9 +
输出 15
3、若已知x在1到8之间,要按如下公式计算y。

y=

4、 输入实数x(已知0<=x<=10),计算y并输出。
2x2+3x+5 x<3
y= (x-3)2 3<=x<6
x>=6
用两种方法编程:
(1) 用IF语句编程;
(2) 用CASE语句编程

<循环体>
循环过程:首先将初值赋给循环变量,然后将循环变量与终值比较,当循环变量的值小于等于终值时,执行循环体。每次执行循环体以后,将循环变量自动加1(即后继值)赋给循环变量,然后再与终值比较,如果与(终值+1)的值相等则退出循环结束For语句,否则再次执行循环体,重复该过程直到循环变量的值与(终值+1)相等。
注意:
1、循环变量必须是有序类型的,且必须与初值与终值的类型相同,例如:整数,字符,而不能是实型。
2、循环变量的初值、终值可以是表达式。
3、循环体可以是任何单个语句或由多个语句组成的复合语句(begin……end)。
4、在循环体内不要随意改变循环变量的值,否则可能会造成死程序循环。
3、 在循环体中,对初、终值表达式值的改变不会影响循环次数及循环变量的取值。

FOR <循环变量>:=<初值> to <终值> do
<循环体>
循环过程:首先将初值赋给循环变量,然后将循环变量与终值比较,当循环变量的值大于等于终值时,执行循环体。每次执行循环体以后,将循环变量自动减1(即前导值)赋给循环变量,然后再与终值比较,如果与(终值-1)的值相等则退出循环结束For语句,否则再次执行循环体,重复该过程直到循环变量的值与(终值-1)相等。
例题二:在1——500中,找出能同时满足用3整除余2,用5整除余3,用7整除余2的所有整除,打印出来。
程序二:
program sunzi;
var I:integer; 仅需一个变量i
begin
for I:=1 to 500 do 直接利用循环变量,对其进行判断
if (I mod 3=2) and (I mod 5=3) and (I mod 7=2) then write(I);
end.
例题三:例题二改进:找出满足条件的数打印出,并统计其个数,最后将总个数打印出来。
程序三:program sunzi;
var I,num:integer;
begin
num:=0; 利用变量num统计符合条件的个数,初始化num=0
for I:=1 to 500 do
if (I mod 3=2) and (I mod 5=3) and (I mod 7=2) then
begin write(I);
num:=num+1; 符合条件时,记数自动累加1
end;
writeln(num); 500次判断后将计算结果打印出来
end.

多重循环概念:
如果一个循环结构的内部(循环体)又包括一个循环结构,就称为多重循环结构。
注意:多重循环的嵌套次数可以是任意的。可以按照嵌套层次数,分别叫做二重循环、三重循环等。处于内部的循环叫做内循环,处于外部的循环叫做外循环。
练习:

1、打印如下图形:
* * * * *
* * * * *
* * * * *
* * * * * * * * * *
* * * * *
* * * * *
* * * * * * * * * *
* * * * *
* * * * *
* * * * * *
* *
* * *
* * * * *
* *
* * *
* * * *
(1) (2) (3) (4) (5)
* * * *
* * *
* *
* * * * *
* * *
* *
* *
* * *
* * * * *
* * * * * * * *
* *
* * *
* * * * * * * * * * *
* * * * *
* * *
*
(6) (7) (8) (9) (10)
2、打印出如下图形:
1
12
123
1234
12345 1
2 2 2
3 3 3 3 3
4 4 4 4 4 4 4 1
2 3 4
5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23 24 25
A
AB
ABC
ABCD
ABCDE A
A B
A B C
A B C D
……
A B C …… Z 1
1 2 1
1 2 3 2 1
1 2 3 4 3 2 1
1 2 3 4 5 4 3 2 1
3、打印杨辉三角形

一、WHILE循环
对于for循环有时也称为计数循环,当循环次数未知,只能根据某一条件来决定是否进行循环时,用while 语句或repeat语句实现循环要更方便。
while语句的形式为:
while <布尔表达式> do <语句>;
其意义为:当布尔表达式的值为true时,执行do后面的语句。
while语句的执行过程为:
①判断布尔表达式的值,如果其值为真,执行步骤2,否则执行步骤4;
②执行循环体语句(do后面的语句);
③返回步骤1;
④结束循环,执行while的下一个语句。
说明:这里while和do为保留字,while语句的特点是先判断,后执行。 当布尔表达式成立时,重复执行do后面的语句(循环体)。
例1 、求恰好使s=1+1/2+1/3+…+1/n的值大于10时n的值。
分析:“恰好使s的值大于10”意思是当表达式s的前n-1项的和小于或等于10,而加上了第n项后s的值大于10。从数学角度,我们很难计算这个n的值。故从第一项开始,当s的值小于或等于10时,就继续将下一项值累加起来。当s的值超过10时,最后一项的项数即为要求的n。
程序如下:
var
s : real;
n : integer;{n表示项数}
begin
s:=0.0;n:=0;
while s<=10 do{当s的值还未超过10时}
begin
n:=n+1;{项数加1}
s:=s+1/n;{将下一项值累加到s}
end;
writlen('n=',n);{输出结果}
end.
例2、求两个正整数m和n的最大公约数。
分析:求两个正整数的最大公约数采用的辗转相除法求解。以下是辗转的算法:
分别用m,n,r表示被除数、除数、余数。
①求m/n的余数r.
②若r=0,则n为最大公约数.若r≠0,执行第③步.
③将n的值放在m中,将r的值放在n中.
④返回重新执行第①步。
程序如下:
program ex4_4;
var m,n,a,b,r:integer;
begin
write('Input m,n:');
readln(m,n);
a:=m;b:=n;r:=a mod b;
while r<>0 do
begin
a:=b;b:=r;
r:=a mod b;
end;
writeln('The greatest common divide is:',b:8);
end.
二、直到循环(REPEAT-until语句)
用while语句可以实现“当型循环”,用repeat-until 语句可以实现“直到型循环”。repeat-until语句的含义是:“重复执行循环,直到指定的条件为真时为止”。
直到循环语句的一般形式:
Repeat
<语句1>;
:
<语句n>;
until <布尔表达式>;
其中Repeat、until是Pascal保留字,repeat与until之间的所有语句称为循环体。
说明:
①repeat语句的特点是:先执行循环,后判断结束条件,因而至少要执行一次循环体。
②repeat-until是一个整体,它是一个(构造型)语句,不要误认为repeat是一个语句,until是另一个语句。
③repeat语句在布尔表达式的值为真时不再执行循环体,且循环体可以是若干个语句,不需用begin和end把它们包起来, repeat 和until已经起了begin和end的作用。while循环和repeat循环是可以相互转化的。
对于例2中求两个正整数的最大公约数,程序可用repeat-until循环实现如下:
var
m,n,a,b,r : integer;
begin
write('Input m,n=');
readln(m,n);
a:=m;b:=n;
repeat
r:=a mod b;
a:=b;b:=r;
until r=0;
writeln('The greatest common divide is',a);
end.
以上我们已介绍了三种循环语句。一般说来,用for 循环比较简明,只要能用for循环,就尽量作用for循环。只在无法使用for循环时才用while循环和repeat-until循环, 而且 while 循环和repeat-until循环是可以互相替代的。for 循环在大多数场合也能用whiel和repeat-until循环来代替。
一般for循环用于有确定次数循环,而while和repeat-until循环用于未确定循环次数的循环。
当一个循环的循环体中又包含循环结构程序时,我们就称之为循环嵌套。
三、循环结构程序设计
例3 求1!+2!+…+10!的值。
分析:这个问题是求10自然数的阶乘之和,可以用for 循环来实现。程序结构如下:
for n:=1 to 10 do
begin
①N!的值àt
②累加N!的值t
end
显然,通过10次的循环可求出1!,2!…,10!,并同时累加起来, 可求得S的值。而求T=N!,又可以用一个for循环来实现:
t=1;
for j:=1 to n do
t:=t*j;
因此,整个程序为:
program ex4_5;
var t,s:real;
i,j,n:integer;
begin
S:=0;
for n:=1 to 10 do
begin
t:=1;
for j:=1 to n do
t:=t*j;
S:=S+t;
end;
writeln(‘s=’,s:0:0);
end.
以上的程序是一个二重的for循环嵌套。这是比较好想的方法,但实际上对于求n!,我们可以根据求出的(n-1)!乘上n即可得到,而无需重新从1再累乘到n。
程序可改为:
program ex4_5;
var t,s:real;
i,j,n:integer;
begin
S:=0;t:=1;
for n:=1 to 10 do
begin
t:=t*n;
S:=S+t;
end;
writeln(‘s=’,s:0:0);
end.
显然第二个程序的效率要比第一个高得多。第一程序要进行1+2+…+10=55次循环,而第二程序进行10次循环。如题目中求的是1!+2!+…+1000!,则两个程序的效率区别更明显。

参考资料:http://fls.xmedu.cn/upload/2007_12/07120107319121.doc

温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-07-07
汗……楼上的太有才了!
const n=5;
var
x:array[1..10] of integer;
y:array[1..10] of Boolean; {用来判重,y[i]<-true表示编号为i的元素可选}
procedure outit; {输出过程}
var i:integer;
begin
for i:=1 to n do
write(x[i]);
writeln;
end;
procedure search(v:integer); {v表示第v个位置}
var i:integer;
begin
if v>n then begin outit;exit;end; {若v超界,一个排列完成}
for i:=1 to n do {在第v个位置上分别放1到n}
if y[i] then {如果不重复,处理第v+1个位置}
begin x[v]:=i;y[i]:=false;search(v+1);y[i]:=true;end;
end;
begin
fillchar(y,sizeof(y),true);
search(1);
end.

说明:使用非递归的好处是节约内存,当一些题目对内存消耗较大时,建议使用非递归方式;但使用递归方式在程序运行时间上要好一些,因为在每个节点扩展时,递归方式少一个范围超界判断。本回答被提问者采纳
相似回答