亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

樹遞歸 - 如何避免“函數結束時缺少返回”?

樹遞歸 - 如何避免“函數結束時缺少返回”?

Go
RISEBY 2022-06-06 18:02:55
對于昆蟲組合學的實驗室問題,以下是我使用樹遞歸的解決方案:func Paths(m int, n int) int {    length := m    width := n    var f func(int, int) int    f = func(h int, v int) int {        if h == width && v == length {            return 1        } else if h < width && v < length {            return f(h, v+1) + f(h+1, v)        } else if v < length {            return f(h, v+1)        } else if h < width {            return f(h+1, v)        } /*else { // this condition doesn't occur            return 0        }*/    } // Line 19    return f(1, 1)}else上述解決方案不需要塊(無效),但編譯器missing return error在第 19 行給出如何避免missing return error上述代碼?
查看完整描述

2 回答

?
互換的青春

TA貢獻1797條經驗 獲得超6個贊

Go 不知道這一點// this condition doesn't occur,并且在分析您的代碼時,它會看到如果沒有if滿足語句的條件,則它缺少返回值。


“解決”此問題的一種方法是執行類似panic("does not occur"). 不過,我不喜歡這樣,因為多年來我遇到了太多的日志條目說“不會發生”......


或者,您可以使用 Go 中可能更自然的方法:


if cond1 {

  return v1

}

if cond2 {

  return v2

}

//... other cases ... 

return v3

或者甚至是一個 switch 語句:


switch {

case cond1:

  return v1

case cond2:

  return v2

//... other cases ... 

default:

  return v3

您使用的“else if”是不必要的,因為每種情況都會導致函數立即返回。檢查 Effective Go 以了解此模式。它也在標準庫中被廣泛使用(即,避免不必要的 else's)。


另外,由于您說絕對不可能所有條件都是錯誤的,因此無需測試最后一個:這是“其他”情況。


查看完整回答
反對 回復 2022-06-06
?
皈依舞

TA貢獻1851條經驗 獲得超3個贊

您明確指出函數 f 返回一個 int,問題是此函數中存在條件不滿足您的任何 if...elseif 條件的情況:


package main


import "fmt"


func main() {

    fmt.Println(Paths(0, 0))

    fmt.Println(Paths(1, 0))

    fmt.Println(Paths(0, 1))

}


func Paths(m int, n int) int {

    length := m

    width := n


    var f func(int, int) int


    f = func(h int, v int) int {

        if h == length && v == width {

            return 1

        } else if h < width && v < width {

            return f(h, v+1) + f(h+1, v)

        } else if v < length {

            return f(h, v+1)

        } else if h < width {

            return f(h+1, v)

        } else { // this condition does occur

            return 0

        }

    } // Line 19


    return f(1, 1)

}

所以這些場景是函數允許的。您可能會在輸入此函數之前驗證這些值,但問題是此函數不執行任何操作,并且傳遞這些值是有效的。


如果你有信心 0,0; 0,1; 并且 1,0 不會是輸入值,您可以else if h < width {通過 else 來避免最后一個;但是這會改變函數的邏輯。同樣,鑒于函數 Paths 已導出,您可能應該對傳入的值進行驗證,如果您需要確保 0,0; 0,1; 和 1;0 選項是不允許的。


如果它符合您的目的,您可以在函數末尾有一個 return ,用于返回 0 或 -1 以指示該值不正確。就個人而言,如果這些值在函數中不可接受,最好驗證輸入并返回錯誤,或者如果必須,請恐慌。


func Paths(m int, n int) int {

    length := m

    width := n


    var f func(int, int) int


    f = func(h int, v int) int {

        if h == length && v == width {

            return 1

        } else if h < width && v < width {

            return f(h, v+1) + f(h+1, v)

        } else if v < length {

            return f(h, v+1)

        } else if h < width {

            return f(h+1, v)

        }


        return 0

    }


    return f(1, 1)

}


查看完整回答
反對 回復 2022-06-06
  • 2 回答
  • 0 關注
  • 176 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號