《计算机程序的构造和解释》读书笔记之线性递归本人愚笨,被译书中“计算过程”与“过程”弄晕了都毫不知情。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));
    }
}

相关文章:

  • 2021-08-30
  • 2022-12-23
  • 2022-12-23
  • 2021-12-09
  • 2021-09-22
  • 2021-05-29
  • 2021-12-09
猜你喜欢
  • 2021-11-20
  • 2022-12-23
  • 2022-01-01
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-01-13
相关资源
相似解决方案