1. 程式人生 > >遞迴集與遞迴可列舉集

遞迴集與遞迴可列舉集

回顧

上文中我們討論了全函式和部分函式,以及計算的可終止性。
本文我們從數論函式開始,給原始遞迴函式集增加一種新的運算,得到了一個更大的集合。
然後根據遞迴函式,我們可以定義遞迴集和遞迴可列舉集,
為以後討論可計算性與可判定性打好基礎。

數論函式

自然數集一般記為N={0,1,2,}N={0,1,2,⋯},那麼nn個自然數集的笛卡爾積記為NnNn
於是,我們稱集合NnNnNN的部分函式為nn元部分數論函式。
作為數論函式,2x2x是一個全函式,而x/2x/2xyx−yxx只是部分函式,
它們的計算結果,3/23/2464−655都不在NN中,於是相應定義域中的點可視為沒有定義。

為什麼討論數論函式呢,其一是因為它是一個典型數學的問題,
另外一點,則是因為我們經常把其他數學問題轉換成數論問題,例如,哥德爾編碼
本文中,使用數論函式,可以簡化我們的描述方式。

一個謂詞,指的是返回布林值的函式,
我們還可以將謂詞看做值域為{0,1}{0,1}的一個數論函式。
00代表True11代表False

極小化運算元

前一篇中,我們從三個初始函數出發,
通過合成運算和原始遞迴運算,得到了原始遞迴函式集,
遞迴函式集是相對於這兩種運算封閉的。

然而,這樣定義的原始遞迴函式,並不能包括所有的數論函式,
一個典型的例子就是,阿克曼函式

ackermann ::
Int -> Int -> Int ackermann 0 x = x+1 ackermann k 0 = ackermann (k-1) 1 ackermann k x = ackermann (k-1) $ ackermann k x-1

它並不是一個原始遞迴函式,(證略
因此原始遞迴函式集並不足以表示計算機程式中的所有函式。

為此,我們需要對原始遞迴函式集進行擴充,我們定義一個新的運算,稱為極小化運算,
P(x1,,xn,t)P(x1,⋯,xn,t)是一個謂詞,令
f(x1,,xn)=minP(x1,,xn,t)f(x1,⋯,xn)=min P(x1,⋯,xn,t)

f(x1,,xn)f(x1,⋯,xn)的值,或者是使

相關推薦

列舉

回顧 上文中我們討論了全函式和部分函式,以及計算的可終止性。 本文我們從數論函式開始,給原始遞迴函式集增加一種新的運算,得到了一個更大的集合。 然後根據遞迴函式,我們可以定義遞迴集和遞迴可列舉集, 為以後討論可計算性與可判定性打好基礎。 數論函式

Fibonacci序列演算法推(Java)

Fibonacci遞推公式: f(1) = f(2) = 1;f(n) = f(n-1)+f(n-2)(n>2).在這裡取他除以10007的餘數 遞迴 public class Fibonacci { static int digui(int n) {

oracle 查詢排序

有時候where查詢出的資料沒有層級關係,想要查詢的不光是是當前層的資料還要包括當前層以及當前層級以下的所有資料 SELECT * FROM pb_join ja INNER JOIN (SELECT org_id, state FROM

bzoj1026-windy數-數位DP-推寫法寫法

(有任何問題歡迎留言或私聊 && 歡迎交流討論哦 題意:傳送門  原題目描述在最下面。  windy定義了一種windy數。不含前導零且相鄰兩個數字之差至少為2的正整數被稱為windy數。 windy想知道,在A和B之間,包括A和B

並查帶權並查

並查集演算法 概要 並查集作為演算法競賽中較為簡單、易用的資料結構,適用於由時序併入的動態集合查詢。並查集中的兩個主要操作就是“合併集合”與“查詢集合” 演算法 用集合中的某個元素來代表這個集合,該元素稱為集合的代表元。 一個集合內的

並查帶權並查(轉)

並查集 並查集是一個很高效演算法,理解起來也很簡單,寫起來更簡單。 ①fat[i] = i; ②找到一個點的祖先 int findfat(int x)   {       if(fat[x] == x) return x;       return fi

專題一 呼叫列舉演算法的例子

#include <iostream> #include <stdio.h> #include <math.h> usingnamespace std;   int main()   {       int a,i;       while(a!=EOF)    

棧式回溯法的幾個問題

1.迷宮求解 2.八皇后 非遞迴 #include <stdio.h> #include <math.h> #include <malloc.h> void nQueens(int *x, int n); /*求解n皇后問題*/ int place

Python漢諾塔問題演算法程式

漢諾塔問題: 問題來源:漢諾塔來源於印度傳說的一個故事,上帝創造世界時作了三根金剛石柱子,在一根柱子上從上往下從小到大順序摞著64片黃金圓盤。上帝命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一回只能移動一個圓盤,只能移動在最頂端的圓盤。有預言說

歸併排序中的分治

在電腦科學中,分治與遞迴是兩個很容易混淆的概念。我覺得很有必要搞清楚二者之間的關係。我的理解,分治是一種思想,遞迴是一種手段。下面是百科裡面對分治和遞迴的定義: 【分治演算法】的基本思想是將一個規模為N的問題分解為K個規模較小的子問題,這些子問題相互獨立且與原問題性質相同。求出子問題的解,就可得

二進位制

**1.寫一個函式返回引數二進位制中 1 的個數 ** 二進位制的運算方式正巧滿足了遞迴的結果,利用除二計算餘數,同時在將最後得到的餘數按照相反的方向輸出,利用全域性變數在整個過程中記錄所需值,有需要時還可以用全域性陣列儲存二進位制數; //寫一個函式返回引數二進位制中 1 的個數 #d

死鎖

程序也有死鎖與遞迴鎖,在程序那裡忘記說了,放到這裡一切說了額 所謂死鎖: 是指兩個或兩個以上的程序或執行緒在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序,如下就是死鎖 1 from

Fibonacci數列演算法演算法

轉載於:http://blog.csdn.net/qq_33951180/article/details/52484080 一、斐波那契數列  由於斐波納挈數列是以兔子的繁殖引入的,因此也叫“兔子數列”。它指的是這樣一個數列:0,1,1,2,3,5,8,13……從這組數可以很明顯看出這

小論c語言

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

[回溯法] 0 回溯法介紹-回溯的區別

【回溯法】有相當一類求一組解、或求全部解或求最優解的問題,例如讀者熟悉的八皇后問題等,不是根據某種確定的計演算法則,而是利用試探的回溯(Backtrcking)的搜尋技術求解 【實質】它的求解過程實質上是一個先序遍歷一棵“狀態樹”的過程,只是這棵樹不是遍歷前預先建立的,而是隱含在遍歷

python中,迴圈舉例

python中,迴圈與遞迴舉例,包括階乘、計算和等。 1、計算階乘:5! 1)迴圈方法計算 # 迴圈方法計算階乘:5! def fact1(n): i = 1 result = 1 while i <= n: result = r

函式巢狀呼叫

函式呼叫不可巢狀,但可以巢狀呼叫函式 r=x>y?x:y 遞迴呼叫 函式直接或者間接的呼叫自身叫做函式的遞迴呼叫 遞迴容易死迴圈,不斷使用空間 所以必須有是遞迴結束的條件 遞迴求解分為兩個階段: 逐層呼叫,呼叫過程中每一步都是未知的,將問題不斷分解為新的子問題,子問題又歸納為新的問題的

十五 連結串列,leetCode203題

兩種方式: package com.lt.datastructure.LinkedList; /** * leetCode 203題 * /** * Definition for singly-linked list. * public class ListNode { * int

資料結構——二叉樹的建立遍歷

#include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct Node{ //二叉樹的鏈式儲存結點 char data; struct Node *Lch

呼叫時間複雜度的學習總結

今天主要學習了兩個知識點。分別是遞迴呼叫和時間複雜度。重點是時間複雜度,比較複雜 。 1. 遞迴函式 1.1題目1: 一共5個人,一個比一個大2歲,最後一個10歲,問第一個多少歲? 首先用迴圈形式來寫函式,如下: int Age1(int n)//O