簡體   English   中英

原始遞歸If else else實際執行if else else

[英]Primitive Recursion If Then Else actually executing If Else Then

我對If If Else的定義中的預測有疑問。 它實際上是以If-Else-Then的身份執行的。

 import Prelude hiding (pred,and,or,not)

 data PR = Z
     | S
     | P Int
     | C PR [PR]
     | PR PR PR
     deriving Show
 eval :: PR -> [Integer] - Integer
 eval Z _ = 0
 eval S [x] = x+1
 eval (P n) xs = nth n xs
 eval (C f gs) xs = eval f (map (\g -> eval g xs) gs)
 eval (PR g h) (0:xs) = eval g xs
 eval (PR g h) (x:xs) = eval h ((x-1) : eval (PR g h) ((x-1):xs) : xs)

 nth _ [] = error "nth nil"
 nth 0 _ = error "nth index"
 nth 1 (x:_) = x
 nth (n) (_:xs) = nth (n-1) xs

 one = C S [Z]
 plus = PR (P 1) (C S [P 2])
 ife = PR (P 1) (C (P 2) [P 3, P 4])

如果我嘗試交換P 3P 4它將完全中斷(每次都返回'then'值)。 ite[0,2,3]應該返回3ite[1,2,3]應該返回2 相反,情況正相反。 我該如何糾正?

你覺得這堂課怎么樣? 我注意到您和我有非常相似的作業,非常相似。

首先,您想創建一個模仿IF-Then-Else模型的基本遞歸函數。 因此,

eval ite [0,1,2] => 1

eval ite [1,2,3] => 3

根據您提供的內容,在相反的情況下(取決於第一個輸入),您似乎正在獲得具有相同質量的功能。

ife = PR (P 1) (C (P 2) [P 3, P 4])

現在您的功能在說什么? 您的ITE實施使用原始遞歸構造,這是一個開始,因為在此情況下,您可以根據條件將執行分為兩個不同的表達式。 布爾代數中使用的條件相同。 如果為0,則為false;否則,如果數字為任意值(0 <),則為true。 如果“堆棧”的頭為0,PR構造會通過評估其第一個參數來執行此操作,否則它會評估其第二個參數,以期希望沿該行的某個位置終止(通常是將頭作為計數器遞減,最終執行第一個參數)。 但是出於所有意圖和目的,我們可以說第二個表達式將在(0 <)上執行。

那么,我們如何解決您的實施問題呢? 簡單:

ife = PR (P 2) (C (P 1) [P 3, P 4])

我們將您的兩個投影切換,因為您只是將它們向后移動。 如果堆棧的頭是Z,我們要投影第二個表達式,否則我們投影第一個表達式。 或更好:

ite = PR (P 2) (P 1)

我認為,我也沒有完成作業,如果我錯了,我將不勝感激。

由於我沒有足夠的能力發表評論,因此我將其留在這里。

我認為應該

ife = PR (P 1) (C (P 2) [P 3, P 3])
                                ^

而不是原始版本

ife = PR (P 1) (C (P 2) [P 3, P 4])
                                ^

如果第一個值不為0,否則將選擇X。否則,將不返回任何隨機值。 它還使寫作和/或/ ...更加容易。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM