-1

再帰関数を使用して、結果の値のリストを出力しようとしています。これは私が思いついたコードですが、それは私に与えます

エラー (CS0161): 'Script_Instance.wrapper(int, int, Grasshopper.DataTree, System.Collections.Generic.List)': すべてのコード パスが値を返すわけではありません (87 行目)

public List<int> wrapper(int br, int depth, DataTree<int> topo, List<double> vals)
{
    List<int> collection = new List<int>();
    collection.Add(br);
    if (depth > 0)
    {
        double[] area = new double[vals.Count - 1];
        for (int i = 0;i < topo.Branches[br].Count;i++) 
        {
            area[i] = vals[topo.Branch(br)[i]];
        }
        double Im = area.Max();

        int IofMaxArea = area.ToList().IndexOf(Im);
        collection.Add(IofMaxArea);
        //  wrapper(topo.Branch(br)[IofMaxArea], de, topo, vals);
        wrapper(topo.Branch(br)[IofMaxArea], depth-1, topo, vals);
    }
    if (depth == 0)
    {
        return collection;
    }
}

正常に動作するが、私のニーズには遅すぎる python スクリプトを改善しようとしています。これはパイソンコードです。

import Grasshopper.DataTree as ghdt
import ghpythonlib.components as ghcomp
import rhinoscriptsyntax as rs

newTree = ghdt[object]()

def wrapper(br,depth):
    if depth>0:
        area = []
        for k in range(topo.Branch(br).Count):
            ar = vals[topo.Branch(br)[k]]

            #polygonC = rs.CloseCurve(polygon)
            area.append(ar)

        IofMaxArea = area.index(max(area))
        collection.append([pts[topo.Branch(br)[IofMaxArea]],topo.Branch(br)[IofMaxArea]])
        #[topo.Branch(br)[IofMaxArea]
        wrapper(topo.Branch(br)[IofMaxArea],depth-1)
    else: return None

def isovister(b,d):

    global collection
    collection = []

    collection.append([pts[b],b])
    wrapper(b,d)
    return collection
if topo.Branch(item).Count !=0:
    results = isovister(item,de)
    a = tuple(x[0] for x in results)
    b = tuple(x[1] for x in results)
else:
    a = None
    b = None

これは Rhino3d+Grasshopper 内にあります。

4

1 に答える 1

1

このコードdepthは、メソッドが再度呼び出される結果となる正の値を確認します。

if (depth > 0)
{
    ...
    ...
    wrapper(topo.Branch(br)[IofMaxArea], depth-1, topo, vals);
}

そのifブロックを超える唯一の方法は、depthが 0 以下の場合ですdepth。その後、 の値を個別に検証する必要はありません。

したがって、これを変更します。

if (depth == 0)
{
    return collection;
}

これに:

return collection;

depth 0 に等しくない場合に返す値を指定していないため、コンパイラは不平を言っています。メソッドが最終的に値を返すことを論理的に知っていても、コンパイラはそうしません。

于 2015-05-24T12:42:12.713 に答える