十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
目录结构: 都在src的目录下
创新互联建站主要从事网站制作、成都网站设计、网页设计、企业做网站、公司建网站等业务。立足成都服务漠河,10多年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:18982081108
主要是web.go 和http.go 的交互,fbn.go做了一个简单的斐波那契数列
先看web.go:
```
package main //入口
import (
"exdefer/filelistenserver/fileting"
"log"
"net/http"
"os"
)
type appHandler func(writer http.ResponseWriter, request *http.Request) error //定义一个实现错误的方法
func errW(handler appHandler) func(writer http.ResponseWriter, request *http.Request) { //实现上面的方法
return func(writer http.ResponseWriter, request *http.Request) {
err := handler(writer, request) //http 的response 和request 设置一个错误的返回值
if err != nil { // 判断一下
log.Print("Print array ", err.Error(), "\n") //打印log
code := http.StatusOK //code 默认设置成200
switch { //switch选择
case os.IsNotExist(err): //如果输入的这个文件不存在
code = http.StatusNotFound //404
case os.IsPermission(err): //如果权限不够
code = http.StatusForbidden //403
default: //否则的话
code = http.StatusInternalServerError //500
}
http.Error(writer, http.StatusText(code), code) //输出 第一个参数 是response,第二个是 错误描述,返回的状态码 在swoole里面是$response-end("") /状态码是$response-status("");大同小异
}
}
}
func main() {
//第一个值是你要走的url目录 swoole里面通过document_root 进行设置
http.HandleFunc("/list/", errW(fileting.Handlist)) //调用的http.go的包
err := http.ListenAndServe(":8888", nil) //监听的端口 第二个值一般给nil
if err != nil {
panic(err)
}
}
```
http.go
```
package fileting //声明包
import (
"io/ioutil"
"net/http"
"os"
)
func Handlist(writer http.ResponseWriter, request *http.Request) error { //方法 返回一个error
path := request.URL.Path[len("/list/"):] //切片 path访问为localhost:8888/list/xxx.txt 中的xxx.txt
file, err := os.Open(path) //分开写了,两个返回值
if err != nil {
//http.Error(writer, err.Error(), http.StatusInternalServerError)
return err //直接return err
}
defer file.Close() //defer 一下 open完要记得
all, err := ioutil.ReadAll(file) //对文件的读取
if err != nil {
//panic(err)
return err
}
writer.Write(all) //reponse 里面的write 类似swoole $response-end()
return nil //如果没有错误返回nil
}
```
演示一下:
今日的学习,结束
给定一个正整数n计算出对应斐波那契数列对应的值
说明:
用mackbookpro i7 2.7GHZ笔记本进行测试,结果如下:
备注: 当n=80时,由于测试等待时间过长,强制中断了执行。
从测试结果看出,当n逐渐增大,递归方式计算斐波拉契数列的时间复杂性急剧增加。当n值较大时可以考虑用循环方式代替。
类似的方式也可以用于,求阶乘、遍历目录、汉诺塔等问题的解决。在后期的文章中,我将这些内容进行补充,敬请期待,谢谢。
这么写效率很低,没有剪枝,存在大量的重复计算。
反正你测试用例是有限的,那我骗过你的测试用例就行了啊;)
;刚刚写好,呵呵,本人测试通过了,希望对您有帮助,为了方便你看,我加了些注释,有问题可以问我...
ASSUME CS:CODE,DS:DATA
DATA SEGMENT
BUFF DB 10
DB ?
DB 10 DUP(?)
RESULT DW ?
RESULT_SHOW DB 10 DUP(?)
DATA ENDS
CODE SEGMENT
START:
MOV AX,DATA
MOV DS,AX
LEA DX,BUFF
MOV AH,0AH
INT 21H
MOV DI,0
L0: ;统计一共有多少个数字组成
CMP BYTE PTR DS:[DI+2],0DH
JZ GO
INC DI
JMP L0
GO: ;计算第n个斐波那契数,把数字字符串转换为十进制数
MOV BL,10
MOV AX,1
MOV SI,DI ;为后面判断输入的是不是只输入一个数有用
MOV CX,DI
L2: PUSH AX
SUB BYTE PTR DS:[DI+1],30H
MUL BYTE PTR DS:[DI+1]
ADD RESULT,AX
POP AX
MUL BL
DEC DI
LOOP L2
;分两种情况:1.输入的是1;2.输入的不是1
CMP SI,1
JNZ L7
CMP BYTE PTR RESULT,1
JNZ L7
MOV AX,RESULT
JZ L4
L7: MOV AX,1
MOV BX,0
MOV CX,RESULT
DEC CX
L3: ;第n个斐波那契数存放到AX中
PUSH AX
ADD AX,BX
POP BX
LOOP L3
L4:
;显示这个斐波那契数
MOV DX,0
LEA SI,RESULT_SHOW
MOV DI,0 ;利用DI来累计一共有多少个数字
L5:
MOV CX,10
CALL DIVDW
ADD CL,30H
MOV DS:[SI],CL
CMP AX,0
JZ L6
INC SI
INC DI
JMP L5
L6:
MOV DL,DS:[SI]
MOV AH,2
INT 21H
CMP DI,0
JZ OK
DEC SI
DEC DI
JMP L6
OK:
MOV AX,4C00H
INT 21H
;参数: (AX)=DWORD型低16位数据
; (DX)=DWORD型高16位数据
; (CX)=除数
;返回: (DX)=结果的高16位,(AX)=结果的低16位
; (CX)=余数
;32位除16位,可以防止溢出!
DIVDW: ;子程序定义开始,功能是分离各个数字出来
PUSH AX
MOV AX,DX
MOV DX,0
DIV CX
MOV BX,AX
POP AX
DIV CX
MOV CX,DX
MOV DX,BX
RET ;子程序定义结束
CODE ENDS
END START
应该是递归层次太多,导致溢出了,考虑这个转变成循环吧,不然70级斐波那契递归层次太多了