Win32汇编备份--递归程序设计

递归程序设计

  1. 设有一棵二叉树,其每个结点的值都是一个字母。该二叉树各结点的值按层(同层的按从左到右的顺序)存储于字符数组B中,如下图字符数组B的值为“ABCDEFGHJKMNOP^^T”,其中“”表示不存在的结点。
    Win32汇编备份--递归程序设计_第1张图片
    现要求编程输入字符数组B的值,然后按中序遍历输出各结点的值。
    若运行后若输入:
    ABCD^^G
    则运行结果输出:
    DBACG
    请在;/和;/之间编写程序。
.386
.model flat, stdcall
option casemap :none
include kernel32.inc
includelib kernel32.lib
includelib	msvcrt.lib		;引用C库文件
printf PROTO C:ptr sbyte,:vararg	;C语言printf函数原型声明
scanf PROTO C:ptr sbyte,:vararg	;C语言scanf函数原型声明
 ;*【*/
.data
infmt BYTE '%s',0
outfmt BYTE '%c',0
s DB 80 DUP(0)
len DWORD ?
flag DWORD 0
.code
PreOrder PROC i:DWORD,mark:DWORD
MOV ESI,i
.IF ESI
  1. 设有一棵完全二叉树,其每个结点的值都是一个字母。该二叉树各结点的值按层(同层的按从左到右的顺序)存储于字符数组B中,如下图字符数组B的值为“ABCDEFGHIJKLMNOPQRST”。 
    现要求编程输入字符数组B的值,然后按先序遍历输出各结点的值。
    Win32汇编备份--递归程序设计_第2张图片
    若运行后若输入:
    ABCDEFG
    则运行结果输出:
    ABDECFG
    请在;/和;/之间编写程序。
.386
.model flat, stdcall
include kernel32.inc
includelib kernel32.lib
includelib	msvcrt.lib		;引用C库文件
printf PROTO C:ptr sbyte,:vararg	;C语言printf函数原型声明
scanf PROTO C:ptr sbyte,:vararg	;C语言scanf函数原型声明
option casemap :none
 ;*【*/
.data
infmt BYTE '%s',0
outfmt BYTE '%c',0
s DB 80 DUP(0)
len DWORD ?
flag DWORD 0
.code
PreOrder PROC i:DWORD,mark:DWORD
MOV ESI,i
.IF ESI
  1. 用归递方法实现Hanoi(汉诺)塔问题。运行后若输入:
    Win32汇编备份--递归程序设计_第3张图片
    1
    则结果输出:
    A移1个盘到C

运行后若输入:
2
则结果输出:
A移1个盘到B
A移1个盘到C
B移1个盘到C

运行后若输入:
3
则结果输出:
A移1个盘到C
A移1个盘到B
C移1个盘到B
A移1个盘到C
B移1个盘到A
B移1个盘到C
A移1个盘到C

请在;/和;/之间编写程序。

.386
.model flat, stdcall
include kernel32.inc
includelib kernel32.lib
includelib	msvcrt.lib				;引用C库文件
printf PROTO C:ptr sbyte,:vararg	;C语言printf函数原型声明
scanf PROTO C:ptr sbyte,:vararg	;C语言scanf函数原型声明
option casemap :none 
 ;*【*/
.data
infmt BYTE '%d',0
outfmt BYTE '%c移1个盘到%c',13,0
x DWORD ?
an DWORD 'A'
bn DWORD 'B'
cn DWORD 'C'
.code
Fun PROC n:DWORD,mark:DWORD,flag:DWORD,temp:DWORD
.IF n<=1
invoke printf,ADDR outfmt,mark,temp
.ELSE
MOV ECX,n
DEC ECX
invoke Fun,ECX,mark,temp,flag
invoke printf,ADDR outfmt,mark,temp
MOV ECX,n
DEC ECX
invoke Fun,ECX,flag,mark,temp
.ENDIF
RET
Fun ENDP
start:
invoke scanf,ADDR infmt,ADDR x
invoke Fun,x,an,bn,cn
RET
end start
 ;*】*/

after all

考题(IMPORTANT!!!)

编一函数fun(int n),用归递方法实现将一个十进制数各位数字按逆序输出。
运行后输入:
123456789
则结果输出:
9,8,7,6,5,4,3,2,1,

.386				;选择的处理器
.model flat, stdcall		;存储模型,Win32程序只能用平展(flat)模型
option casemap:none		;指明标识符大小写敏感
include	kernel32.inc		;要引用的头文件
includelib	kernel32.lib	;要引用的库文件
includelib	msvcrt.lib	;引用C库文件
scanf PROTO C:DWORD,:vararg	;C语言scanf函数原型声明
printf PROTO C:DWORD,:vararg	;C语言printf函数原型声明
.data				;⑤数据段
fmt	BYTE	'%d',0		;定义变量
n	DWORD	0
.code				;⑥代码段
 ;*【*/
outfmt BYTE '%d,',0
fun PROC x:DWORD
LOCAL flag:DWORD
MOV flag,10
MOV EAX,x
CDQ
IDIV flag
MOV EDI,EAX
invoke printf,ADDR outfmt,EDX
.IF EDI!=0
invoke fun,EDI
.ENDIF
RET
fun ENDP
 ;*】*/
start:				;定义标号start
invoke scanf,ADDR fmt,ADDR n	;输入n的值
invoke fun,n 
invoke ExitProcess,0		;退出进程,返回值为0
end	start			;指明程序入口点start
 ;*】*/

编一函数fun(int n),用归递方法实现求十进制数中各位值为奇数的数字和,运行后输入正整数n,然后输出和。
运行后输入:
1234567891
则结果输出:
26

.386				;选择的处理器
.model flat, stdcall		;存储模型,Win32程序只能用平展(flat)模型
option casemap:none		;指明标识符大小写敏感
include	kernel32.inc		;要引用的头文件
includelib	kernel32.lib	;要引用的库文件
includelib	msvcrt.lib	;引用C库文件
scanf PROTO C:DWORD,:vararg	;C语言scanf函数原型声明
printf PROTO C:DWORD,:vararg	;C语言printf函数原型声明
.data				;⑤数据段
fmt	BYTE	'%d',0		;定义变量
n	DWORD	0
.code				;⑥代码段
 ;*【*/
fun PROC x:DWORD
LOCAL flag:DWORD,tamp:DWORD,mark:DWORD,tem:DWORD,sum:DWORD
MOV sum,EAX
MOV flag,10
MOV tamp,2
MOV EAX,x
CDQ
IDIV flag
MOV tem,EDX
MOV mark,EAX
MOV EAX,tem
CDQ
IDIV tamp
.IF EDX!=0
MOV EAX,sum
ADD EAX,tem
MOV sum,EAX
.ENDIF
MOV EDI,mark
.IF EDI!=0
MOV EAX,sum
invoke fun,EDI
.ELSE
MOV EAX,sum
SUB EAX,1
invoke printf,ADDR fmt,EAX
.ENDIF
RET
fun ENDP
 ;*】*/
start:				;定义标号start
invoke scanf,ADDR fmt,ADDR n	;输入n的值
invoke fun,n 
invoke ExitProcess,0		;退出进程,返回值为0
end	start			;指明程序入口点start

设有一棵二叉树,其每个结点的值都是一个字母。该二叉树各结点的值按层(同层的按从左到右的顺序)存储于字符数组B中,如下图字符数组B的值为“ABCDEFGHJKMNOP^^T”,其中“”表示不存在的结点。
Win32汇编备份--递归程序设计_第4张图片
现要求编程输入字符数组B的值,然后按中序遍历输出各结点的值。
若运行后若输入:
ABCD^^G
则运行结果输出:
DBACG
请在;/和;/之间编写程序。

.386
.model flat, stdcall
option casemap :none
include kernel32.inc
includelib kernel32.lib
includelib	msvcrt.lib		;引用C库文件
printf PROTO C:ptr sbyte,:vararg	;C语言printf函数原型声明
scanf PROTO C:ptr sbyte,:vararg	;C语言scanf函数原型声明
 ;*【*/
.data
infmt BYTE '%s',0
outfmt BYTE '%c',0
s BYTE 80 DUP(0)
flag DWORD 0
.code
InOrder PROC x:DWORD,len:DWORD
MOV ESI,x
.IF ESI

设有一棵完全二叉树,其每个结点的值都是一个字母。该二叉树各结点的值按层(同层的按从左到右的顺序)存储于字符数组B中,如下图字符数组B的值为“ABCDEFGHIJKLMNOPQRST”。
Win32汇编备份--递归程序设计_第5张图片
现要求编程输入字符数组B的值,然后按先序遍历输出各结点的值。
若运行后若输入:
ABCDEFG
则运行结果输出:
ABDECFG
请在;/和;/之间编写程序。

.386						;选择的处理器
.model flat, stdcall		;存储模型,Win32程序只能用平展(flat)模型
option casemap:none			;指明标识符大小写敏感
include	kernel32.inc		;要引用的头文件
includelib	kernel32.lib	;要引用的库文件
includelib	msvcrt.lib		;引用C库文件
scanf PROTO C:DWORD,:vararg	;C语言scanf函数原型声明
printf PROTO C:DWORD,:vararg	;C语言printf函数原型声明
.data						;⑤数据段
 ;*【*/
infmt BYTE '%s',0
outfmt BYTE '%c',0
s BYTE 80 DUP(0)
flag DWORD 0
.code
PreOrder PROC x:DWORD,len:DWORD
MOV ESI,x
.IF ESI

Hanoi(汉诺塔)问题,传说梵天创造世界时做了三根宝石针A、B、C,在A针上从下往上按照从大到小顺序穿着64个大小不同的圆盘(如下图)。梵天命令僧侣借助B针把圆盘从A针移到C针上,移动的规则是:一次只能移动一片,且不管在哪根针上,小盘必须在大盘之上。现请编程实现僧侣的工作,程序运行后输入圆盘数n,输出每一步移动的顺序。
Win32汇编备份--递归程序设计_第6张图片
运行后若输入:
1
则结果输出:
A移1个盘到C
运行后若输入:
2
则结果输出:
A移1个盘到B
A移1个盘到C
B移1个盘到C
运行后若输入:
3
则结果输出:
A移1个盘到C
A移1个盘到B
C移1个盘到B
A移1个盘到C
B移1个盘到A
B移1个盘到C
A移1个盘到C
请在;/和;/之间编写程序。

.386						;选择的处理器
.model flat, stdcall		;存储模型,Win32程序只能用平展(flat)模型
option casemap:none			;指明标识符大小写敏感
include	kernel32.inc		;要引用的头文件
includelib	kernel32.lib	;要引用的库文件
includelib	msvcrt.lib		;引用C库文件
scanf PROTO C:DWORD,:vararg	;C语言scanf函数原型声明
printf PROTO C:DWORD,:vararg	;C语言printf函数原型声明
.data						;⑤数据段
 ;*【*/
infmt BYTE '%d',0
outfmt BYTE '%c移1个盘到%c',13,0
n DWORD ?
flag DWORD 'A'
mark DWORD 'B'
tamp DWORD 'C'
.code
Hanoi PROC x:DWORD,an:DWORD,bn:DWORD,cn:DWORD
MOV EAX,x
.IF EAX<=1
invoke printf,ADDR outfmt,an,cn
.ELSE
MOV EAX,x
SUB EAX,1
invoke Hanoi,EAX,an,cn,bn
invoke printf,ADDR outfmt,an,cn
MOV EAX,x
SUB EAX,1
invoke Hanoi,EAX,bn,an,cn
.ENDIF
RET
Hanoi ENDP
start:
invoke scanf,ADDR infmt,ADDR n
invoke Hanoi,n,flag,mark,tamp
RET
end start
 ;*】*/

编一函数fun(int n),用归递方法实现将一个十进制数各位数字按逆序输出。
运行后输入:
123456789
则结果输出:
987654321
请在;/和;/之间编写程序。

.386				;选择的处理器
.model flat, stdcall		;存储模型,Win32程序只能用平展(flat)模型
option casemap:none		;指明标识符大小写敏感
include	kernel32.inc		;要引用的头文件
includelib	kernel32.lib	;要引用的库文件
includelib	msvcrt.lib	;引用C库文件
scanf PROTO C:DWORD,:vararg	;C语言scanf函数原型声明
printf PROTO C:DWORD,:vararg	;C语言printf函数原型声明
.data				;⑤数据段
fmt	BYTE	'%d',0		;定义变量
n	DWORD	0
.code				;⑥代码段
 ;*【*/
fun PROC x:DWORD
MOV EAX,x
MOV ECX,10
CDQ
IDIV ECX
MOV EDI,EAX
invoke printf,ADDR fmt,EDX
.IF EDI!=0
invoke fun,EDI
.ENDIF
RET
fun ENDP
 ;*】*/
start:				;定义标号start
invoke scanf,ADDR fmt,ADDR n	;输入n的值
invoke fun,n 
invoke ExitProcess,0		;退出进程,返回值为0
end	start			;指明程序入口点start

编一函数fun(int n),用归递方法实现将十进制数转换为八进制数,运行后输入正整数n,输出n的八进制数。
运行后输入:
255
则结果输出:
377
请在;/和;/之间编写程序。

.386				;选择的处理器
.model flat, stdcall		;存储模型,Win32程序只能用平展(flat)模型
option casemap:none		;指明标识符大小写敏感
include	kernel32.inc		;要引用的头文件
includelib	kernel32.lib	;要引用的库文件
includelib	msvcrt.lib	;引用C库文件
scanf PROTO C:DWORD,:vararg	;C语言scanf函数原型声明
printf PROTO C:DWORD,:vararg	;C语言printf函数原型声明
.data				;⑤数据段
fmt	BYTE	'%d',0		;定义变量
n	DWORD	0
.code				;⑥代码段
 ;*【*/
fun PROC x:DWORD
Local anw
MOV EAX,x
.IF EAX!=0
MOV EAX,x
MOV ECX,8
CDQ
IDIV ECX
MOV EDI,EAX
MOV anw,EDX
invoke fun,EDI
invoke printf,ADDR fmt,anw
.ENDIF
RET
fun ENDP
 ;*】*/
start:				;定义标号start
invoke scanf,ADDR fmt,ADDR n	;输入n的值
invoke fun,n 
invoke ExitProcess,0		;退出进程,返回值为0
end	start			;指明程序入口点start

编一函数fun(int n),用归递方法实现将十进制数转换为二进制数,运行后输入正整数n,输出n的二进制数。
运行后输入:
250
则结果输出:
11111010
请在;/和;/之间编写程序。

.386				;选择的处理器
.model flat, stdcall		;存储模型,Win32程序只能用平展(flat)模型
option casemap:none		;指明标识符大小写敏感
include	kernel32.inc		;要引用的头文件
includelib	kernel32.lib	;要引用的库文件
includelib	msvcrt.lib	;引用C库文件
scanf PROTO C:DWORD,:vararg	;C语言scanf函数原型声明
printf PROTO C:DWORD,:vararg	;C语言printf函数原型声明
.data				;⑤数据段
fmt	BYTE	'%d',0		;定义变量
n	DWORD	0
.code				;⑥代码段
 ;*【*/
fun PROC x:DWORD
Local anw
MOV EAX,x
.IF EAX!=0
MOV EAX,x
MOV ECX,2
CDQ
IDIV ECX
MOV EDI,EAX
MOV anw,EDX
invoke fun,EDI
invoke printf,ADDR fmt,anw
.ENDIF
RET
fun ENDP
 ;*】*/
start:				;定义标号start
invoke scanf,ADDR fmt,ADDR n	;输入n的值
invoke fun,n 
invoke ExitProcess,0		;退出进程,返回值为0
end	start			;指明程序入口点start

编一函数fun(int n),用归递方法实现n!,运行后输入正整数n,输出n!。
运行后输入:
5
则结果输出:
120
请在;/和;/之间编写程序。

.386				;选择的处理器
.model flat, stdcall		;存储模型,Win32程序只能用平展(flat)模型
option casemap:none		;指明标识符大小写敏感
include	kernel32.inc		;要引用的头文件
includelib	kernel32.lib	;要引用的库文件
includelib	msvcrt.lib	;引用C库文件
scanf PROTO C:DWORD,:vararg	;C语言scanf函数原型声明
printf PROTO C:DWORD,:vararg	;C语言printf函数原型声明
.data				;⑤数据段
fmt	BYTE	'%d',0		;定义变量
n	DWORD	0
.code				;⑥代码段
 ;*【*/
fun PROC x:DWORD
.IF x==1
invoke printf,ADDR fmt,EAX
.ELSE
IMUL EAX,x
MOV ECX,x
DEC ECX
invoke fun,ECX
.ENDIF
RET
fun ENDP
 ;*】*/
start:						;定义标号start
invoke scanf,ADDR fmt,ADDR n	;输入n的值
invoke fun,n 
invoke ExitProcess,0		;退出进程,返回值为0
end	start					;指明程序入口点start

编一函数fun(int n),用归递方法实现求十进制数各位数字和,运行后输入正整数n,输出n各位数字和。
运行后输入:
123456789
则结果输出:
45
请在;/和;/之间编写程序。

.386				;选择的处理器
.model flat, stdcall		;存储模型,Win32程序只能用平展(flat)模型
option casemap:none		;指明标识符大小写敏感
include	kernel32.inc		;要引用的头文件
includelib	kernel32.lib	;要引用的库文件
includelib	msvcrt.lib	;引用C库文件
scanf PROTO C:DWORD,:vararg	;C语言scanf函数原型声明
printf PROTO C:DWORD,:vararg	;C语言printf函数原型声明
.data				;⑤数据段
fmt	BYTE	'%d',13,0		;定义变量
n	DWORD	0
.code				;⑥代码段
 ;*【*/
fun PROC x:DWORD
LOCAL flag:DWORD,tamp:DWORD,mark:DWORD,tem:DWORD,sum:DWORD
MOV sum,EAX
MOV flag,10
MOV tamp,2
MOV EAX,x
CDQ
IDIV flag
MOV tem,EDX
MOV mark,EAX
MOV EAX,sum
ADD EAX,tem
MOV EDI,mark
.IF EDI!=0
invoke fun,EDI
.ELSE
SUB EAX,1
invoke printf,ADDR fmt,EAX
.ENDIF
RET
fun ENDP
 ;*】*/
start:				;定义标号start
invoke scanf,ADDR fmt,ADDR n	;输入n的值
invoke fun,n 
invoke ExitProcess,0		;退出进程,返回值为0
end	start			;指明程序入口点start

求排列组合数
输入:6 2
输出:15

.386
.model flat, stdcall
include kernel32.inc
includelib kernel32.lib
includelib	msvcrt.lib				;引用C库文件
printf PROTO C:ptr sbyte,:vararg	;C语言printf函数原型声明
scanf PROTO C:ptr sbyte,:vararg	;C语言scanf函数原型声明
option casemap :none 
 ;*【*/
.data
infmt BYTE '%d%d',0
outfmt BYTE '%d ',0
x DWORD ?
y DWORD ?
.code
Com PROC a:DWORD,b:DWORD
LOCAL t:DWORD
MOV ECX,a
MOV EDX,b
.IF EDX>ECX
MOV EAX,0
.ELSE
.IF EDX==1
MOV EAX,a
.ELSE
.IF ECX==EDX
MOV EAX,1
.ELSE

MOV ECX,a
SUB ECX,1
MOV EAX,b
SUB EAX,1
invoke Com,ECX,EAX
MOV t,EAX

MOV ECX,a
SUB ECX,1
invoke Com,ECX,b
ADD EAX,t

.ENDIF
.ENDIF
.ENDIF
RET
Com ENDP
start:
invoke scanf,ADDR infmt,ADDR x,ADDR y
invoke Com,x,y
invoke printf,ADDR outfmt,EAX
RET
end start
 ;*】*/

你可能感兴趣的:(Win32汇编备份--递归程序设计)