《计算机程序的构造和解释》读书笔记之线性递归

《计算机程序的构造和解释》读书笔记之线性递归本人愚笨,被译书中“计算过程”与“过程”弄晕了都毫不知情。process 在译书中被译为:“计算过程”;procedure被译为:“过程”。而 process 有时又译为“过程”。

process 与 procedure 在本书中的区别

process 是程序在计算机中的处理过程。见译书的第1页第1段第1行:“计算过程(computational process)是存在于计算机里的一种抽象,在其演化发展中,这些过程(process)会去操作另外被称为数据(data)的抽象事物。”。

procedure 是对 process 用编程语言来进行描述,也就是程序的源码。见译书第3页第1行:“计算过程的Lisp描述,称为过程(procedures)”。

弄清两者的区别后,继续阅读 1.2 节的递归 process 与递归 procedure。

p.s. TopLanguage群组中有高手在谈 programming 翻译为“编程”?“程序设计(program design)”?一样有意思。有争论就有进步嘛。

线性递归

线性递归与树形递归相区别,不同点可以看累加阶乘实例。关于“递归”的知识,下面引用Dexter.Yy的《递归与递推:JavaScript在斐波那契数的尾递归方法》中的:

在程序执行的过程中,“递归”(recursive)指的是一种方法,把大的复杂的问题分解成更小更简单的问题,逐级分解下去,直到问题的规模小到可以直接求解,然后再逐级向上回溯直到解决最初的问题。递归的计算过程(recursive process)包含了两个阶段,先逐级扩展(expansion),构造起一个由被推迟的操作组成的链条(会被解释器保存在堆栈里),然后在收缩(contraction)阶段逐级回溯执行那些操作。

Ackermann(阿克曼)函数是以德国数字家阿克曼命名的函数,它是线性递归中线性增长较快的一种。在网上有习题 1.10 的答案

下面是用JavaScript改写的程序实现:


function A(x,y)

{

    if(y==0)

    {

        return 0;

    }

    if(x==0)

    {

        return 2*y;

    }

    if(y==1)

    {

        return 2;

    }

    else{

        return arguments.callee(x-1,arguments.callee(x,y-1));    

        }

}

用C#语言的程序实现:


using System;



class TestCase

{

    static int A(int x, int y)

    {

        int sum = 0;

        if(y==0)

        {

            return sum;

        }

        if(x==0)

        {

            sum = 2*y;

            return sum;

        }

        if(y==1)

        {

            sum = 2;

            return sum;

        }

        else

        {

            sum = A(x-1, A(x, y-1));

            return sum;

        }

    }

    static void Main()

    {

        Console.Write(A(1, 10));

    }

}

你可能感兴趣的:(读书笔记)